Как я могу заставить regex / sed распознавать строку, в которой находится строка поиска? - PullRequest
1 голос
/ 16 февраля 2011

Я новичок в регулярных выражениях. Я пытаюсь написать скрипт для комментирования строк в файле, чтобы при удалении сетевого компьютера мы могли удалить его из наших административных файлов (rdist и т. Д.), Не комментируя их вручную. То, что я пока имею, это

#!/bin/bash

echo $*                      
NAMES=$*                    
FILES="/foo/testfile1        
/foo/testfile2"

for name in $NAMES
        do               
        sed -i "s/${name}/#&/g" $FILES
done
exit 0

Это работает, когда в тестовых файлах целевая строка появляется в начале строки, но не в том случае, если строка находится где-то посередине. Как я могу сказать sed или regex вставить хеш в начало строки, в которой находится строка?

(Я читал в Интернете кучу учебников, но ближе всего к тому, что я хочу, это карат ^. Из объяснения я получаю, что в многострочном режиме он возвращает только экземпляры строки, расположенные в начале строки.)

Я работаю над RedHat 5.5, использую gedit 2.8.1 в качестве моего текстового редактора и sed 4.1.2.

Заранее благодарю за помощь!

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Сценарий ниже будет принимать переданные аргументы и искать их как целые слова. т.е. если аргумент foo, то blah foo bar будет закомментирован, а blahfoo bar - нет. Я также добавил немного кода, чтобы, если строка совпадала с несколькими аргументами, вы все равно получили только один # в начале строки.

#!/bin/bash

FILES="./test1 ./test2"

for name; do
  sed -i "/\<$name\>/s/^#*/#/" $FILES
done
0 голосов
/ 16 февраля 2011

Похищение структуры из SiegeX и упрощение программы sed:

#!/bin/bash

FILES="./test1 ./test2"

for name; do
  sed -i "s/^.*$name.*$/#&/" $FILES
done

Идея состоит в том, что вместо того, чтобы использовать шаблон для выбора и затем s для редактирования, вы используете шаблон s для выполнения обоих:распознать полную строку, содержащую имя цели, и заменить ее закомментированной версией.

Вы можете сделать это более элегантно, объединив имена в одно большое регулярное выражение;это позволило бы sed сделать один проход, а не N. Это достаточно просто, чтобы я оставил это в качестве упражнения для читателя ...

...