2017-02-16 1 views
0

Я искал вокруг, но не мог найти способ сделать это с обоими AWK и SED. Мне было интересно, есть ли способ заменить начало и конец строки одной командой.

более конкретно, есть файл с большим количеством слов в нем, и я хотел бы добавить что-то перед тем слово и после слово.

Спасибо, Рой

+5

Не могли бы вы показать нам пример того, что вы пробовали с правильными i/p и o/p и версиями 'Awk',' sed' у вас есть? вывод 'awk --version' и' sed --version' – Inian

ответ

2

Поскольку вы сказали:более конкретно, есть файл с большим количеством слов в нем, и Я хотел бы добавить что-то перед словом и после слова.

Единственное, что вам нужно, это $&, что соответствует самому себе. Таким образом, вы просто можете написать что-нибудь, что хотите, только до и конец этой whildcard. это оно.

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

this is line 1. 
this is line 2. 
this is line 3. 

И я тестировал с Perl:
perl -lne 'print "beginning->", $&, "<-end" if /.+/g' file
которого выход есть:

beginning->this is line 1.<-end 
beginning->this is line 2.<-end 
beginning->this is line 3.<-end 

мая вы бы например, чтобы соответствовать только одному слову, так что все еще это хорошо, поэтому lution такие как:

perl -lne 'use English; print "$PREMATCH", "[$MATCH]","$POSTMATCH" if /line/g' file 

Здесь я соответствовал line и поставить вокруг этого: [ затем $& затем ]
выход

this is [line] 1. 
this is [line] 2. 
this is [line] 3. 

ПРИМЕЧАНИЕ
Как вы можете видеть единственные вещи лет u нужно только prematch и матч и postmatch. Я тестировал его с Perl для вас, и если вы заинтересованы в Perl вы можете использовать его, или, возможно, вы хотите использовать Sed или Awk. Поскольку у вас нет конкретных примеров Я пробовал с Perl.

+1

Я раньше никогда не видел 'use English'. Это так круто. Спасибо за новую вещь на сегодня. – Stats4224

0

Если вы хотите, чтобы обернуть конкретное слово с маркерами вы можете использовать & в строке замены, чтобы добиться того, чего вы хотите.

Например поставить квадратные скобки вокруг каждого вхождения слова птицы:

$ echo "hello bird, are you really a bird?" | sed "s/\bbird\b/[&]/g" 
hello [bird], are you really a [bird]? 
+1

вы можете использовать '\ b', например, мой текст имеет' thunderbird' – Kent

+0

Да, отредактирован. Спасибо за предложение – Chrs

0

заменить начала и конца строки в одной команде

Допустим, у нас есть тест файл с линией:

tag hello, world tag 

Приложить все tag слово в угловых скобках <...> мы можем применить:

AWK подход с gsub() функции:

awk '{ gsub(/\<tag\>/, "<&>"); print}' test_file 

границы слов \<, \> может отличаться в зависимости от реализаций AWK


sed подход:

sed 's/\btag\b/<&>/g' test_file 

Выход (для обоих подходов):

<tag> hello, world <tag> 
+0

С sed и awk нам не нужно использовать cat test_file | AWK/СЭД. awk/sed сможет самостоятельно прочитать test_file. – RavinderSingh13

+0

@ RavinderSingh13, конечно, я, должно быть, мечтаю ... – RomanPerekhrest

Смежные вопросы