Text Sed:如何替换文本文件中的下一行\n符号?
我需要修复一个错误,并用以下结构的XML文件中的Text Sed:如何替换文本文件中的下一行\n符号?,text,sed,Text,Sed,我需要修复一个错误,并用以下结构的XML文件中的替换第二个标记: <time>20260664</time> <tags>substancesummit ss</time> <geo>asdsadsa</geo> <time>20260664</time> <tags>substancesummit ss</time> <geo>asdsadsa</geo&g
替换第二个标记
:
<time>20260664</time>
<tags>substancesummit ss</time>
<geo>asdsadsa</geo>
<time>20260664</time>
<tags>substancesummit ss</time>
<geo>asdsadsa</geo>
有什么帮助吗?sed通常会编辑行,要让它像您一样一次理解多行就有点困难了。相反,如何更直接地修复断开的线,使用如下方式:
/<tags>/ s@</time>@</tags>@
sed '/<\/time>/I{n;:A;N;h;/<geo>/I!{H;bA};/<geo>/I{g;s/<\/time>/<\/tags>/i}}' file.txt
<time>20260664</time>
<tags>substancesummit ss
</time>
<Geo>asdsadsa</geo>
<time>30260664</time>
<tags>substancesummit st</timE>
<geo>bsdsadsa</geo>
//s@@@
这将仅在也包含
的行上用
替换
。请注意,我使用了@
而不是/
作为替换命令的分隔符,以避免我们试图替换的XML中的斜杠转义。sed通常编辑行,要让它像您一样一次理解多行有点困难。相反,如何更直接地修复断开的线,使用如下方式:
/<tags>/ s@</time>@</tags>@
sed '/<\/time>/I{n;:A;N;h;/<geo>/I!{H;bA};/<geo>/I{g;s/<\/time>/<\/tags>/i}}' file.txt
<time>20260664</time>
<tags>substancesummit ss
</time>
<Geo>asdsadsa</geo>
<time>30260664</time>
<tags>substancesummit st</timE>
<geo>bsdsadsa</geo>
//s@@@
这将仅在也包含
的行上用
替换
。请注意,我使用了@
而不是/
作为替换命令的分隔符,以避免需要在我们试图替换的XML中转义斜杠。您可以使用awk
$ awk -vRS="</geo>" '{gsub(/<\/time>.<geo>/,"</tags>\n<geo>")}1' ORS="</geo>" file
<time>20260664</time>
<tags>substancesummit ss</tags>
<geo>asdsadsa</geo>
<time>20260664</time>
<tags>substancesummit ss</tags>
<geo>asdsadsa</geo>
$awk-vRS=“”{gsub(/。/,“\n”)}1'ORS=“”文件
20260664
物质总结
ASDSA
20260664
物质总结
ASDSA
首先,我可以看到
结束了每个块,所以将其作为记录分隔符。之后,替换所需的内容。最后,将
放回作为输出记录分隔符(ORS)。您可以使用awk
$ awk -vRS="</geo>" '{gsub(/<\/time>.<geo>/,"</tags>\n<geo>")}1' ORS="</geo>" file
<time>20260664</time>
<tags>substancesummit ss</tags>
<geo>asdsadsa</geo>
<time>20260664</time>
<tags>substancesummit ss</tags>
<geo>asdsadsa</geo>
$awk-vRS=“”{gsub(/。/,“\n”)}1'ORS=“”文件
20260664
物质总结
ASDSA
20260664
物质总结
ASDSA
首先,我可以看到
结束了每个块,所以将其作为记录分隔符。之后,替换所需的内容。最后,将
放回作为输出记录分隔符(ORS)。您可以在一个sed命令中这样做:
/<tags>/ s@</time>@</tags>@
sed '/<\/time>/I{n;:A;N;h;/<geo>/I!{H;bA};/<geo>/I{g;s/<\/time>/<\/tags>/i}}' file.txt
<time>20260664</time>
<tags>substancesummit ss
</time>
<Geo>asdsadsa</geo>
<time>30260664</time>
<tags>substancesummit st</timE>
<geo>bsdsadsa</geo>
sed'//I{n;:A;n;h;//I!{h;bA};//I{g;s///I}}file.txt
测试
如果您的input file.txt如下所示:
/<tags>/ s@</time>@</tags>@
sed '/<\/time>/I{n;:A;N;h;/<geo>/I!{H;bA};/<geo>/I{g;s/<\/time>/<\/tags>/i}}' file.txt
<time>20260664</time>
<tags>substancesummit ss
</time>
<Geo>asdsadsa</geo>
<time>30260664</time>
<tags>substancesummit st</timE>
<geo>bsdsadsa</geo>
20260664
物质总结
ASDSA
30260664
物质总结
BSDSA
然后上述命令的输出将为:
<time>20260664</time>
<tags>substancesummit ss
</tags>
<Geo>asdsadsa</geo>
<time>30260664</time>
<tags>substancesummit st</tags>
<geo>bsdsadsa</geo>
20260664
物质总结
ASDSA
30260664
物质总结
BSDSA
它包括多个新行字符(\r
或\n
)在
和
之间的任意组合
PS:上面的sed命令正在执行忽略注意搜索/替换,如果您不想这样做,那么只需从sed命令中删除
I
标志,或者让我知道。您可以在一个sed命令中这样做:
/<tags>/ s@</time>@</tags>@
sed '/<\/time>/I{n;:A;N;h;/<geo>/I!{H;bA};/<geo>/I{g;s/<\/time>/<\/tags>/i}}' file.txt
<time>20260664</time>
<tags>substancesummit ss
</time>
<Geo>asdsadsa</geo>
<time>30260664</time>
<tags>substancesummit st</timE>
<geo>bsdsadsa</geo>
sed'//I{n;:A;n;h;//I!{h;bA};//I{g;s///I}}file.txt
测试
如果您的input file.txt如下所示:
/<tags>/ s@</time>@</tags>@
sed '/<\/time>/I{n;:A;N;h;/<geo>/I!{H;bA};/<geo>/I{g;s/<\/time>/<\/tags>/i}}' file.txt
<time>20260664</time>
<tags>substancesummit ss
</time>
<Geo>asdsadsa</geo>
<time>30260664</time>
<tags>substancesummit st</timE>
<geo>bsdsadsa</geo>
20260664
物质总结
ASDSA
30260664
物质总结
BSDSA
然后上述命令的输出将为:
<time>20260664</time>
<tags>substancesummit ss
</tags>
<Geo>asdsadsa</geo>
<time>30260664</time>
<tags>substancesummit st</tags>
<geo>bsdsadsa</geo>
20260664
物质总结
ASDSA
30260664
物质总结
BSDSA
它包括多个新行字符(\r
或\n
)在
和
之间的任意组合
PS:上面的sed命令正在执行忽略照护搜索/替换,如果您不想这样做,那么只需从sed命令中删除I
标志或告诉我即可。使用以下方法:
$ sed -n '1h; 1!H; $ {g; s/<\/time>\n<geo>/<\/tags>\n<geo>/g; p;}' file
$sed-n'1h;1.H、 美元{g;s/\n/\n/g;p;}文件
使用以下方法:
$ sed -n '1h; 1!H; $ {g; s/<\/time>\n<geo>/<\/tags>\n<geo>/g; p;}' file
$sed-n'1h;1.H、 美元{g;s/\n/\n/g;p;}文件
为什么不尝试匹配换行符来回避这个问题,而是尝试将行与开头的
标记及其后的内容匹配到(非)匹配的
标记?像
# untested, written from scratch
sed 's/<tags>(.*)<\/time>/<tags>\1<\/tags>/g' infile > outfile
#未经测试,从头开始编写
sed的/(.*)/\1/g填充>输出文件
为什么不尝试匹配换行符来回避这个问题,而是尝试将行与开头的
标记及其后的内容匹配到(非)匹配的
标记?像
# untested, written from scratch
sed 's/<tags>(.*)<\/time>/<tags>\1<\/tags>/g' infile > outfile
#未经测试,从头开始编写
sed的/(.*)/\1/g填充>输出文件
与
但结束标记始终与开始标记相同
如果在文件中找到多个标记对,则可能会失败
详细地说,它搜索某物,从“”开始,然后是内容,直到'
与
但结束标记始终与开始标记相同
如果在文件中找到多个标记对,则可能会失败
详细地说,它会搜索一些内容,从“”开始,然后是内容,直到“如果文件中有一个您肯定不使用的字符,请尝试用它替换\n,执行sed操作,然后重新替换。tr在这方面做得很好
cat old.txt | tr '\n' '#' | sed 's/time>#<geo>/tags>#<geo>/g' | tr '#' '\n' > new.txt
cat old.txt | tr'\n''| sed's/time>|/tags>|/g'| tr'|'''\n'>new.txt
我使用#作为替换字符。如果文件中有一个您肯定不使用的字符,请尝试用它替换\n,执行sed工作,然后重新替换。tr在这方面做得很好
cat old.txt | tr '\n' '#' | sed 's/time>#<geo>/tags>#<geo>/g' | tr '#' '\n' > new.txt
cat old.txt | tr'\n''| sed's/time>|/tags>|/g'| tr'|'''\n'>new.txt
我使用#作为替换字符。它具体如何不起作用?@Rafe Kettler它不会替换内容。输出与原始内容相同。可能是重复的,具体是如何不起作用的?@Rafe Ketterr它不会替换内容。输出与原件相同。可能的副本