我是正则表达式的新手。我正在尝试编写一个脚本来注释文件中的行,这样当我们退出网络计算机时,我们可以将它从我们的管理文件(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。
提前感谢您的帮助!
答案 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.这很容易让我把它作为练习留给读者...