我在这里学习sed,这里有多个命令:
(user@host)-(18:27:39)-(~/Bash_Programming)
$sed '4 { s/fox/elephant/; s/dog/cat/ }' catAndDog.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown elephant jumps over the lazy cat
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
但是,如果我使用多个命令并希望将结果写入文件,我应该将 w 替换标志放在哪里?
w file = write the result of the substitution to a file
编辑:
我想将整个输出写入文件,即原始文件的副本以及所做的更改。
回应:
您可以重定向到像这样的文件
-i
或使用标志就地修改:...或从原始文件中备份并使用相同的原始文件名写入更改。
或使用
w
命令:如果您只想编写
s
命令替换成功的行(这不是您当前要求的),使用该w
标志可以执行以下操作:该
w
标志必须以换行符终止,或者必须是 sed 脚本中的最后一项(包括它的参数)。如果找到空格、注释或分号,它们将包含在文件名中。不要混淆与
w
命令替换s
(s///w
) 和w
命令相关的标志。它们相似,但w
仅在执行替换时才使用该标志。请注意,w
根据 sed 脚本(用例),可以有条件地或无条件地使用该命令。注意:选项
i
(--in-place
) 不是由 POSIX 指定的。第一个例子
第二个例子
有人可能会遇到与您的案例有关的问题(见下文),因为在同一输入行上执行了多个替换。
只修改了一个输入行,但输出文件包含两行。
这个结果不方便,因为它具有误导性。
我的解决方案允许创建原始文件的备份
input.back
(该算法使用命令。input
output
w
如果找到或未找到(均未找到),该命令将
/fox|dog/!d
立即开始下一个循环。因此,如果未找到关键字,则不会为当前行处理以下命令( 、、 )。fox
dog
s///
p
w
实际上,有两个
w
要素。一个是命令,另一个是s///
旗帜。两者都用于将当前模式空间写入文件。
命令
例如,此
w
命令将写入outfile
(制作副本):该
-n
选项避免打印任何模式空间,但该w
命令将write
每个模式(行)到命令之后的参数中的文件名w
(应该结束命令)。相反,这将只写一行(具有(至少) one 的行
C
):旗帜
另一个
w
元素是命令的w
标志s///
,尽管它的含义大致相同write
,但只有在s///
命令中的替换被执行时才会执行:第一季度
由于替换标志连接到一个(特定)替换,它应该在哪里使用取决于需要记录哪个替换:
请注意,每个替换必须在单独的
-e
(或单独的行)中,因为输出文件名的名称必须结束命令(需要换行符),或者可以写成:可以选择其他替换:
或两者:
或使用
w
命令(不是标志)(并假设 GNU sed):第二季度
除非所有行都发生了替换,否则替换标志不能写入整个文件。您需要使用
w
命令(假设 bash):了解每个替换的
w
标志将为每个替换打印一行,因此会发生这种情况: