如何用新行替换单词

如何用新行替换单词

我有一个包含以下数据的文本文件,每行以|END|.

T|somthing|something|END|T|something2|something2|END|

我正在尝试|END|\nsed 替换新行。

 sed 's/\|END\|/\n/g' test.txt

但它产生了错误的输出,如下所示:

 T
 |
 s
 o
 m
 e
 ...

但我想要的是这样的:

T|somthing|something
T|something2|something2

我也尝试过tr。它也不起作用。

答案1

用这个:

sed 's/|END|/\n/g' test.txt

您尝试的操作不起作用,因为 sed 使用基本正则表达式,并且您的 sed 实现有一个\|表示“或”的运算符(BRE 的常见扩展),因此您编写的内容会用换行符替换(空字符串或END或空字符串)。

答案2

以下对我来说效果很好:

$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2

请注意,我只是在回车键后面加上了反斜杠。

答案3

您可以使用awk

$ awk -F'\\|END\\|' '{$1=$1}1' OFS='\n' file
T|somthing|something
T|something2|something2
  • -F'\\|END\\|'将字段分隔符设置为|END|
  • OFS='\n'将输出字段分隔符设置为换行符
  • $1=$1使用as 字段分隔符进行awk重建$0OFS
  • 1是一个真值,导致awk打印整个输入行

答案4

另一种方法sed不打印空行:

sed 's/|END|/\
/g;/^$/!P;D' infile

例如输入:

T|one|two|END|T|three|four|END|
T|five|six|END|T|seven|eight|END|
T|nine|ten|END|T|eleven|twelve|END|

输出:

T|one|two
T|three|four
T|five|six
T|seven|eight
T|nine|ten
T|eleven|twelve

同样的事情ed

ed -s infile <<'IN'
1,$j
s/|END|/\
/g
,p
q
IN

相关内容