Чистый вывод используя sed - PullRequest
1 голос
/ 25 июня 2019

У меня есть файл, который начинается с такого формата

INFO|NOT-CLONED|/folder/another-folder/another-folder|last-folder-name|

Мне нужно прочитать файл и получить вывод:

INFO|NOT-CLONED|last-folder-name

Пока у меня есть это:

cat clone_them.log | grep 'INFO|NOT-CLONED' | sed -E 's/INFO\|NOT-CLONED\|(.*)/g'

Но не работает, как задумано

ПРИМЕЧАНИЕ: последние «другая папка» и «последняя папка-имя совпадают»

Ответы [ 2 ]

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

Если вы хотите sed-решение:

$ sed -En 's/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\1\2/p' file
INFO|NOT-CLONED|last-folder-name

Как это работает:

  • -E

    Использовать расширенное регулярное выражение

  • -n

    Не печатайте, если мы явно не скажем это.

  • s/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\1\2/p

    Найдите строки, которые включают INFO|NOT-CLONED| (сохраните это в группе 1), затем что-нибудь, .*, затем |, за которым следуют любые символы, кроме |, [^|]* (сохраненные в группе 2), с последующим | в конце строки. Текст замены - группа 1, за которой следует группа 2.

    Опция p указывает sed печатать строку, если совпадение выполнено успешно. Поскольку замена выполняется только для строк, содержащих INFO|NOT-CLONED|, это устраняет необходимость в дополнительном grep процессе.

Variation: возвращение только имени последней папки

Чтобы просто получить last-folder-name без INFO|NOT-CLONED, нам нужно только удалить \1 из вывода:

$ sed -En 's/(INFO\|NOT-CLONED\|).*\|([^|]*)\|$/\2/p' file
last-folder-name

Поскольку нам больше не нужна первая группа захвата, мы могли бы упростить и удалить ненужные теперь парены, чтобы единственной группой захвата было имя последней папки:

$ sed -En 's/INFO\|NOT-CLONED\|.*\|([^|]*)\|$/\1/p' file
last-folder-name
1 голос
/ 25 июня 2019

Это проще в awk, поскольку входной файл правильно разделен символом |. Вы должны указать awk, что поля ввода разделены |, а выходные данные также должны быть разделены символом |, используя IFS и OFS соответственно.

awk 'BEGIN{FS=OFS="|"}/INFO\|NOT-CLONED/{print $1,$2,$(NF-1)}' clone_them.log
INFO|NOT-CLONED|last-folder-name
...