sed 内联编辑对于多个 sed 语句失败

sed 内联编辑对于多个 sed 语句失败

我想#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
  1. g全局正则表达式

  2. \v开启魔法

  3. s代替

  4. 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失败时破坏您的文件)

相关内容