【发布时间】:2018-06-26 17:40:15
【问题描述】:
假设我们想用 sed 将 text.txt 文件中的摩尔斯电码等价的字母“a”替换为隐藏的 .out.txt 文件,原始文件的内容为“这是一个测试” .
#!/bin/bash
touch .out.txt
cat text.txt > .out.txt
sed 's/a/.-/g' .out.txt
正如预期的那样,输出是“这是 .- 测试”。
但是,假设我们想要执行多个 sed 实例,而不是使用 -n 参数不断打印每个 sed 实例的结果。在这种情况下:
#!/bin/bash
touch .out.txt
cat text.txt > .out.txt
sed -n 's/a/.-/g' .out.txt
sed -n 's/t/-/g' .out.txt
cat .out.txt
但是,在这种情况下,cat 的输出与 text.txt 的内容相同,“这是一个测试”。
是否有可能替代-n,或者一般来说有一种方法可以防止 sed 打印任何符合我们想要的结果的内容?
【问题讨论】:
-
sed -n 's/t/-/g' .out.txt并没有真正改变out.txt。 -
强调@anubhava 所说的内容:
sed默认情况下不会修改命令行中引用的文件。它只是将修改后的输出发送到 stdout。 没有您所做的任何事情都不会更改您的.out.txt文件。 -
另外,
-n禁止自动输出。然后,您必须告诉 sed 要输出什么(在表达式末尾使用p)。sed -in 's/a/.-/pg' .out.txt... 注意:这不会打印不匹配的行。 -
有什么理由不选择
sed -e 's/a/.-/g' -e 's/t/-/g' test.txt > .out.txt吗?