Я хочу найти строку в строке текста и распечатать строку (между пробелами) и первое слово фразы.
Например:
«Это одна строка текста» "Еще одна вещь" "Лучше попробуй еще раз" "Лучше"
Список строк:
текст предмет пытаться Лучше
Я пытаюсь получить такую таблицу:
Этот [вкладка] текст Еще одна [вкладка] вещь Это [вкладка] попробуйте Лучше
Я пытался с grep, но ничего не произошло. Любое предложение?
command-line
text-processing
regex
Фелипе Лира
источник
источник
Ответы:
Версия Bash / grep:
Назовите это так:
Вывод:
источник
Perl на помощь!
Сохранить как
first-plus-word
, запустить какЭто создает регулярное выражение из входных слов. Затем каждая строка сопоставляется с регулярным выражением, и, если есть совпадение, печатается первое слово, и если оно отличается от слова, слово печатается тоже.
источник
Вот версия awk:
где
file2
список слов иfile1
содержит фразы.источник
Вот версия Python:
Демо-версия:
Примечание стороны : Скрипт
python3
совместим, так что вы можете запустить его либоpython2
илиpython3
.источник
Попробуй это:
Если перед вкладкой
Better
есть проблема, попробуйте это:Выше был протестирован на GNU SED (называется
gsed
на OSX). Для BSD sed могут потребоваться некоторые незначительные изменения.Как это устроено
s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/
Это ищет слово,
[[:alnum:]]+
сопровождаемое пробелом,[[:space:]]
сопровождаемое чем угодно.*
, сопровождаемое одним из ваших словtext|thing|try|Better
, сопровождаемое чем угодно. Если он найден, он заменяется первым словом в строке (если есть), вкладкой и соответствующим словом.ta; b; :a; s/^\t//; p
Если команда подстановки привела к подстановке, что означает, что одно из ваших слов было найдено в строке, то
ta
команда сообщает sed перейти к меткеa
. Если нет, то мы переходим (b
) к следующей строке.:a
определяет метку а. Итак, если одно из ваших слов было найдено, мы (а) делаем замену,s/^\t//
которая удаляет ведущую вкладку, если она есть, и (б) печатаем (p
) строку.источник
Простой подход bash / sed:
while read w; do ...; done < words
Будет перебирать каждую строку в файлwords
и сохранить его как$w
. В-n
маркеsed
ничего по умолчанию не печатает. Затемsed
команда заменит двойные кавычки, за которыми следуют непробельные символы (\"(\S*)
круглые скобки служат для «захвата» того, что соответствует\S*
, первое слово, и мы можем позже сослаться на него как\1
), 0 или более символов (.*
), а затем слово, которое мы ищем ($w
) и 0 или более символов снова (.*
). Если это совпадает, мы заменяем его только 1-м словом, табуляцией и$w
(\1\t$w
), и печатаем строку (это то, что делаетp
ins///p
).источник
Это версия Ruby
Образец текстового файла
hello.txt
содержитЗапуск с
ruby source.rb hello.txt
результатами висточник