sed - 在多个文件中应用更改

sed - 在多个文件中应用更改

我有数百个包含“ </foo:bar>”的文件

cc
bb
aa
</foo:bar>
dd
xx
vv

我想一次性将它们全部更改为

cc
bb
aa
</foo:bar>

当我给它确切的文件名时 sed 工作得很好

sed -i "/</foo:bar>/q" 99999.txt

但当我尝试立即改变所有这些时,我没有得到任何结果。

 sed -i "/<\/foo:bar>/q" *.txt

答案1

尝试:

sed -s -n -i '0,/<\/foo:bar>/p' *.txt

-s告诉 sed 将每个文件视为单独的。

因为我们不想sed在所有文件完成之前退出,所以我们更改为仅从头开始打印<\/foo:bar>,而不打印其余行。 -n告诉 sed 除非我们明确要求,否则不要打印。该命令0,/<\/foo:bar>/p告诉 sed 打印从文件开头到匹配的第一行范围内的任何行<\/foo:bar>

-s选项不适用于 BSD/OSX sed。

答案2

</foo:bar>要在找到文件时停止读取文件:

使用 GNU awk

gawk -i /usr/share/awk/inplace.awk '{print}; $0 == "</foo:bar>" {nextfile}' ./*.txt

perl

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt

gawk不使用-i inplaceas尝试首先从当前工作目录gawk加载inplace扩展(asinplace或),有人可能已经在其中植入了恶意软件。随系统提供的扩展inplace.awk的路径可能会有所不同,请参阅输出inplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

答案3

使用文件的就地编辑可能会损害它们。相反,请将更改写入新文件,如下面的示例所示:

find . -maxdepth 1 -iname "*.txt" -print0 | parallel -0 "sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/\"/\&quot;/g; s/'\"'\"'/\&#39;/g' {} > {}_Html_Passed.txt"

上面的 sed 命令读取每个文件,在并行命令的帮助下并行执行 html 敏感/特殊字符的多次替换(请参阅:并行安装)并将它们写入相应的新输出文件。

另请注意,sed 命令内的双引号需要用 \ 转义,因为并行命令本身需要它们。

find 命令的 -maxdepth 值可以根据我们的需要进行调整。

此代码还将帮助那些想要在网络上发布任何类型的脚本的人,而不会受到浏览器渲染的影响。另外,使用 html 的 pre 标签来包围它们的脚本也会有所帮助。

来源 :我的开源项目

相关内容