我有数百个包含“ </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 inplace
as尝试首先从当前工作目录gawk
加载inplace
扩展(asinplace
或),有人可能已经在其中植入了恶意软件。随系统提供的扩展inplace.awk
的路径可能会有所不同,请参阅输出inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
答案3
使用文件的就地编辑可能会损害它们。相反,请将更改写入新文件,如下面的示例所示:
find . -maxdepth 1 -iname "*.txt" -print0 | parallel -0 "sed 's/&/\&/g; s/</\</g; s/>/\>/g; s/\"/\"/g; s/'\"'\"'/\'/g' {} > {}_Html_Passed.txt"
上面的 sed 命令读取每个文件,在并行命令的帮助下并行执行 html 敏感/特殊字符的多次替换(请参阅:并行安装)并将它们写入相应的新输出文件。
另请注意,sed 命令内的双引号需要用 \ 转义,因为并行命令本身需要它们。
find 命令的 -maxdepth 值可以根据我们的需要进行调整。
此代码还将帮助那些想要在网络上发布任何类型的脚本的人,而不会受到浏览器渲染的影响。另外,使用 html 的 pre 标签来包围它们的脚本也会有所帮助。
来源 :我的开源项目