Text Sed:如何替换文本文件中的下一行\n符号?

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

我需要修复一个错误,并用以下结构的XML文件中的
替换第二个标记

<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它不会替换内容。输出与原件相同。可能的副本