Есть хороший способ скопировать столбцы текста из файла с помощью регулярных выражений в мой монтажный картон?

В настоящее время решение, которое у меня есть, довольно уродливо и довольно похоже на спагетти-код... есть хороший способ сделать это с помощью "стандартного" инструмента, такого как ack?

Сейчас у меня есть файл в следующем формате:

crap.txt:

IdentifierA Some Text
IdentifierB Some Other

Вот как я сейчас понимаю:

cat crap.txt |
ack (?<=IdentifierA ).+ |
awk '{ print $(NF-1), $NF }' |
pbcopy

Это даст Some Text в вашем картоне.

Вместо того, чтобы просто иметь ack отобразить строку, соответствующую регулярному выражению, а затем получить последние два столбца этой строки с помощью awkМогу ли я получить конкретное совпадение с регулярным выражением для вывода на консоль? Я пытался с помощью grep -o но это, кажется, не имеет позитивного взгляда...

2 ответа

Решение

Некоторым нравится это:

awk '/IdentifierA/ { print $(NF-1),$NF}' crap.txt
Some Text

Этот поиск для IdentifierA и распечатать два последних из этой строки.

awk -F'IdentifierA\\s*' '$0=$2' file

эта строка выберет весь текст после вашего IdentifierA (с удаленными начальными пробелами / табуляцией) независимо от того, сколько пробелов у вас есть в целевой части. это означает, что вам не нужно print $(NF-n), $(NF-n-1)... или если текст имеет TAB вместо space

Например, в этом случае:

IdentifierA a b c d e f g h i j k l

тестовое задание:

kent$  echo "IdentifierA Some Text
IdentifierB Some Other"|awk -F'IdentifierA\\s*' '$0=$2' 
Some Text

kent$  echo "IdentifierA a b c d e f g h i j k l"|awk -F'IdentifierA\\s*' '$0=$2'
a b c d e f g h i j k l 

Кстати, grep - очень удобный инструмент, если вы хотите извлечь текст:

kent$  echo "IdentifierA a b c d e f g h i j k l"|grep -oP 'IdentifierA\s*\K.*'  
a b c d e f g h i j k l
Другие вопросы по тегам