如何让regex / sed识别搜索字符串所在的行?

时间:2011-02-15 21:55:43

标签: regex bash insert sed

我是正则表达式的新手。我正在尝试编写一个脚本来注释文件中的行,这样当我们退出网络计算机时,我们可以将它从我们的管理文件(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 个答案:

答案 0 :(得分:2)

下面的脚本将接受传入的参数并将其作为整个单词查找。即如果参数为foo,则blah foo bar将被注释掉,但blahfoo bar则不会。我还添加了一些代码,这样如果一行与多个参数匹配,你仍然只能在行的开头得到一个#

#!/bin/bash

FILES="./test1 ./test2"

for name; do
  sed -i "/\<$name\>/s/^#*/#/" $FILES
done

答案 1 :(得分:0)

从SiegeX窃取结构并简化sed程序:

#!/bin/bash

FILES="./test1 ./test2"

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

我们的想法是,不是使用模式来选择然后使用s进行编辑,而是使用s模式执行这两种操作 - 识别包含目标名称的完整行,并将其替换为注释掉的版本。

通过将名称合并为一个大的正则表达式,您可以更优雅地完成此操作;那会让sed做一次而不是N.这很容易让我把它作为练习留给读者...