我想#SB#
在与给定字符串匹配的每一行的开头附加
因克朗.sh
sed -i -e'/test1/s/^/#SB#/g' file1
sed -i -e'/test2/s/^/#SB#/g' file1
sed -i -e'/test4/s/^/#SB#/g' file1
文件1
/apps/pmserver $ cat file1
00 45 /ser/bat/ab.sh test1
00 45 /ser/bat/ab.sh test2
00 45 /ser/bat/ab.sh test3
00 45 /ser/bat/ab.sh test4
/apps/pmserver $
我正在使用科恩外壳。
sed
我可以输出到一个新文件,但如果脚本中有多个语句(如上所示),则它不起作用。我收到错误
sed: Not a recognized flag: i
我想做的是注释掉crontab
属于特定团队的一些条目。 test1 test2...是它们的文件名,需要将其关闭。
答案1
sed 的参数-i
是 GNU 扩展。您可能没有运行 GNU sed,这就是您收到有关-i
无法识别的错误的原因。
答案2
您的 sed (可能)是非 GNU,因此不支持用于就地编辑的 -i 。您可以通过使用临时文件来避免它:
sed -i -e'/test1/s/^/#SB#/g' file1
变成
sed -e'/test1/s/^/#SB#/g' file1 > temp_file
mv temp_file file1
当然你可以通过像这样使用 mktemp 做得更好
tmpfile=`mktemp`; sed -e '/test1/s/^/#SB#/g' file1 > $tmpfile; mv $tmpfile file1
绝对要避免sed 并重定向而无需临时文件,因为原始文件将被截断。
答案3
您可以在 Ex 模式下使用 Vim:
ex -sc 'g/\vtest(1|2|4)/s/^/#SB#/' -cx file1
g
全局正则表达式\v
开启魔法s
代替x
保存并关闭
答案4
答案解释说,这-i
是非标准的,甚至解释说要使用临时文件,但他们忽略了如何对多个语句执行此操作的主要问题。
您当然可以重定向每个语句并在每个语句之后复制回来。但无论如何,您不需要sed
为每个语句单独调用,您可以使用多个指定多个脚本-e
:
sed -e '/test1/s/^/#SB#/g' -e '/test2/s/^/#SB#/g' -e' /test4/s/^/#SB#/g' file1
或者您可以sed
使用以下命令连接命令;
:
sed '/test1/s/^/#SB#/g;/test2/s/^/#SB#/g;/test4/s/^/#SB#/g' file1
在您的示例中,您甚至可以找到一个正则表达式来组合替换:
sed '/test[124]/s/^/#SB#/g' file1
一旦我们改进了脚本:命令g
的标志s
代表“替换行上的所有出现”,但由于每一行只有一个开头(^
),你可以删除它,所以你的最终工作是
sed '/test[124]/s/^/#SB#/' file1 > /tmp/file1 && mv /tmp/file1 file1
(&&
用于避免sed
失败时破坏您的文件)