Есть ли способ извлечь отдельные строки символов, несколько раз, с помощью grep / sed. Начинается с "(" - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь извлечь все коды станций из текстового файла. Я преобразовал этот файл из XML в. TXT

Вот пример текста, из которого я пытаюсь извлечь.

<tr bgcolor="#F2F9FF"><td headers="Station Name"><a href="display.php?stid=KMLJ">Milledgeville, Baldwin County Airport</a> (KMLJ)</td>
<td headers="rss"><div align="center"><a href="KMLJ.rss"><img src="/images/rss.jpg" alt="RSS Format" width="36" height="14" border="0"></a></div></td>
<td headers="xml"><div align="center"><a href="KMLJ.xml"><img src="/images/xml.gif" alt="XML Format" width="36" height="14" border="0"></a></div></td>
</tr>
<tr><td headers="Station Name"><a href="display.php?stid=K2J5">Millen Airport</a> (K2J5)</td>
<td headers="rss"><div align="center"><a href="K2J5.rss"><img src="/images/rss.jpg" alt="RSS Format" width="36" height="14" border="0"></a></div></td>
<td headers="xml"><div align="center"><a href="K2J5.xml"><img src="/images/xml.gif" alt="XML Format" width="36" height="14" border="0"></a></div></td>
</tr>
<tr bgcolor="#F2F9FF"><td headers="Station Name"><a href="display.php?stid=KD73">Monroe-Walton County Airport</a> (KD73)</td>
<td headers="rss"><div align="center"><a href="KD73.rss"><img src="/images/rss.jpg" alt="RSS Format" width="36" height="14" border="0"></a></div></td>
<td headers="xml"><div align="center"><a href="KD73.xml"><img src="/images/xml.gif" alt="XML Format" width="36" height="14" border="0"></a></div></td>
</tr> 

Я пробовал grep и sed.

 sed -n '(k' stations.txt 

Я хочу экспортировать либо в CSV, либо в текстовый файл с нужной строкой, то есть (KMLJ) (K2J5) (KD73)

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Вы можете использовать

grep -o '([Kk][^()]*)' stations.txt

Или, чтобы получить значения без скобок:

grep -Po '\(\K[Kk][^()]+' stations.txt # GNU grep required
# Or, just pipe a sed to remove the initial (:
grep -o '([Kk][^()]*' stations.txt | sed 's/^(//'

Или только с sed, если в строке есть одно значение:

sed -n 's/.*(\([kK][^()]*\).*/\1/p'  stations.txt

Опция -o будет выводить только совпадающие тексты.

([Kk][^()]*) - это шаблон POSIX BRE, который соответствует:

  • ( - буквальный ( символ
  • [Kk] - выражение в скобках, соответствующее k или K
  • [^()]* - выражение в скобках с отрицанием, соответствующее любому символу, но ( и ) ноль или более раз
  • ) - ) char.
0 голосов
/ 18 июня 2019

Вы имеете в виду что-то подобное?

sed -n '/Station Name/ {s/.*stid=\([^"]*\)">\([^<]*\)<.*/\1 \2/;p}' file.txt

объяснение

sed -n            # use sed with no default output
'/Station Name/   # use onle lines with Station Name
{                 # start block
s                 # substitute
/                 # separator
.*stid=\([^"]*\)  # extract Station ID and save it in arg1 (\1)
">                # ignore this pattern
\([^<]*\)         # extract Station Name and save it in arg2 (\2)
<.*               # ignore rest of line
/\1 \2/;p         # print arg1 and arg2
}                 # end of block
' file.txt        # read from this file

вывод ваших тестовых данных

KMLJ Milledgeville, Baldwin County Airport
K2J5 Millen Airport
KD73 Monroe-Walton County Airport
...