以多种表达方式进行就地辩论


24

我正在尝试通过使用替换文件中的多个单词 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 -i2次获得以下输出。

 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作为文件并尝试对其进行处理。


如果您的文件与上面的示例相似(即,它们遵循相同的模式),则可以执行一次替换操作:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti 2014年

Answers:


26

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

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

gs这里,您不需要在命令中使用最后一个斜杠,因为每行只需要替换一次即可。

或者:

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

-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
请注意,您正在描述GNU变体。BSD变体(如FreeBSD或OS / X中一样)要求使用参数-i。所以sed -i '' 's/a/b/;s/c/d/' filesed -i .back 's/a/b/;s/c/d/'sed -i.back 's/a/b/;s/c/d/'有。其他sed实现通常不支持-i
斯特凡Chazelas

感谢@StéphaneChazelas进行了澄清。我想我应该更明确地说,在GNU sed中,和扩展之间不能有空格-i
下午14年

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpresult sed: -e expression #1, char 141: unterminated s'command`
alhelal '18

@alhelal对不起,评论不是问问题的适当地方。但是无论如何,您的最后一条s命令缺少其final /
下午2点

@ PM2Ring,因为我没有注意到它与您的解决方案有关。但是,谢谢。
alhelal '18年

10

您可以将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

5

使用多个-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

您应该为备份文件提供扩展名,因为当OS的某些实现(sedOSX sed)不能与空扩展名一起使用时(您必须使用它sed -i ''来覆盖原始文件)。


1

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

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

  2. s 替代

  3. x 保存并关闭

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.