我有一个包含以下数据的文本文件,每行以|END|
.
T|somthing|something|END|T|something2|something2|END|
我正在尝试|END|
用\n
sed 替换新行。
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
重建$0
OFS
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