Linux Grep Вероятно, простой ответ - PullRequest
0 голосов
/ 09 ноября 2011

Я работаю с zone.tab в /usr/share/zoneinfo/zonetab, и у меня возникают проблемы с отображением данных в определенном формате.

команда, которую я запускаю:

cat zone.tab | awk '!/#/ {print $3}' | sort

возвращает список регионов и стран:

America/Washington
Pacific/Enderbury

Мне нужно, чтобы вышесказанное возвращало все после последнего / в каждой строке.

Есть несколько случаев, таких как Pacific/Somewhere/A. У меня есть регулярное выражение ([^/]+$), которое должно работать, но это не так. Есть идеи?

Ответы [ 5 ]

5 голосов
/ 09 ноября 2011

Вы также можете сделать все это одной командой awk:

awk '!/^#/ { sub(".*/", "", $3); print $3 }' /usr/share/zoneinfo/zone.tab
     ----    -----------------   --------
        |                   |          |
  for non-comment lines     |          |
                            |          |
                     modify 3rd col    |
                   leaving only text   |
                   after last slash    |
                                       |
                                 Then print modified 3rd col
1 голос
/ 09 ноября 2011

Это регулярное выражение может работать:

# echo -e "a\n\a/b\na/b/c\na/b/c/d\n" |sed 's#^\(\([^/]*/\)*\)\(.*\)#\3#'
a
b
c
d

Возможно, sed -r 's#^(([^/]*/)*)(.*)#\3#', который устраняет клубок обратной косой черты, более понятен.

1 голос
/ 09 ноября 2011
sed s:.*/:: /usr/share/zoneinfo/zone.tab
1 голос
/ 09 ноября 2011
awk '!/^#/ { print $3;} ' < /usr/share/zoneinfo/zone.tab   | awk -F/ ' { print $NF; }'
1 голос
/ 09 ноября 2011

Передайте вывод на sed -e 's;^.*/;;'.Например,

echo -e "America/Washington\nPacific/Enderbury" | sed 's;^.*/;;'
...