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

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"

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

user3342338
источник

Ответы:

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
Graeme
источник
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 .

kenorb
источник
примечание: bufdo - это не POSIX. pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Стивен Пенни,
0

Пытаться:

sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
DopeGhoti
источник