Как добавить текст в конец строки, когда образец соответствует?


8

входы:

line1 with the PATTERN that contains ( ) 
line2 with the PATTERN that contains ( ) 
lineN with the PATTERN that contains ( ) 

выходы:

line1 with the PATTERN that contains ( ) ;
line2 with the PATTERN that contains ( ) ;
...
lineN with the PATTERN that contains ( ) ;

Я попробовал это:

find . -name "test.txt" -print | xargs sed -i "/PATTERN/ s/$)/); /g"

но это не сработало.

Ответы:


3
perl -ipe 's/$/;/ if /PATTERN/'

Это добавит ;в конце, если строка содержит PATTERN.


3

Соответствует $концу строки, поэтому ваш шаблон должен быть таким )$же, $)как в вашем примере.

Кроме того, вам xargsздесь не нужно , безопаснее использовать -execфлаг fine:

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' +

Если ваша версия find не работает +в конце, используйте \;вместо этого (спасибо @ glenn-jackman ):

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' \;

Наконец, нет необходимости в gфлаге в s/something$//идиоме, так как в $каждой строке есть только одно вхождение .


1
Вы получите некоторую эффективность -exec ... +вместо -exec ... \;, если ваша находка позволяет это.
Гленн Джекман

2

Предполагая, что PATTERNэто на самом деле ( )и что-то может идти между ( )и что они не обязательно находятся в конце строки:

sed -i '/(.*)/ s/$/ ;/' test.txt

1

Использование ex(что эквивалентно vi -e/ vim -e).

Один файл:

ex +"g/local/s/$/;/g" -cwq foo.txt

Все test.txtфайлы рекурсивно:

ex +"bufdo g/local/s/$/;/g" -cxa **/test.txt

Примечание: убедитесь, что опция globbing ( **) включена: shopt -s globstarесли ваша оболочка поддерживает это.

Примечание: :bufdoкоманда не POSIX .



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.