sed 具有多个表达式作为就地参数

sed 具有多个表达式作为就地参数

我正在尝试使用以下命令替换文件中的多个单词

sed -i #expression1 #expression2

文件

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

输出(所需)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

试用

sed -i我可以通过使用两次得到以下输出。

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

我可以有任何可能的方法将其作为单个就地命令,例如

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

当我尝试上面的代码时,它将s/item/stuff/g作为一个文件并尝试对其进行处理。

答案1

根据您系统上的版本,sed您可能可以执行以下操作

sed -i 's/Some/any/; s/item/stuff/' file

g此处命令中的最后一个斜杠后面不需要s,因为您只对每行进行一次替换。

或者:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

或者:

sed -i '
  s/Some/any/
  s/item/stuff/' file

-i选项(GNU 扩展现在被一些其他实现支持,尽管有些需要-i ''替代)告诉sed就地编辑文件;如果紧随其后有字符,-ised对原始文件进行备份,并使用这些字符作为备份文件的扩展名。例如,

sed -i.bak 's/Some/any/; s/item/stuff/' file

或者

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

将修改file,将原始保存到file.bak.

当然,在Unix(或类Unix)系统上,我们通常使用'~'而不是'.bak',所以

sed -i~ 's/Some/any/;s/item/stuff/' file

答案2

您可以将 sed 表达式与“;”链接在一起

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

答案3

使用多个选项的多个表达式-e

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

或者你可以只使用一个:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

您应该为备份文件提供扩展名,因为当某些实现时sed,例如OSX sed不适用于空扩展名(您必须使用它sed -i ''来覆盖原始文件)。

答案4

您可以在 Ex 模式下使用 Vim:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. %选择所有行

  2. s代替

  3. x保存并关闭

相关内容