Answers:
用这个:
sed 's/|END|/\n/g' test.txt
您尝试的操作不起作用,因为sed使用基本正则表达式,并且sed实现具有一个\|
运算符,表示“或”(BRE的通用扩展名),因此您编写的内容用END
换行符替换(空字符串或空字符串)。
\n
)。该问题询问如何用|END|
换行符代替而不是\n
。
以下对我来说很好:
$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2
请注意,我只是在反斜杠后面加了回车键。
\|
在正则表达式中进行替换,但不\n
表示s
替换中的换行符?
另一个可能 awk命令并使用其RS
选项将是:
awk '$1=$1' RS="\|END\|" file
将打印那些不为空(至少具有一个字段)的记录(基于awk的R ecord S分隔符),以防止打印空行。
在此输入上测试:
T|somthing|something|END|T|something2|something2|END|
Test|END|
|END|
给出以下输出:
T|somthing|something
T|something2|something2
Test
这清除了所有空行:)如果您也想换行,请$1=$1
用$0
in命令替换:
awk '$0' RS="\|END\|" file
$1=$1
将空格序列压缩为一个空格字符,如果第一个字段为0,则返回false。这没有意义。你可能想awk 1 RS='\\|END\\|'
或awk NF RS='\\|END\\|'
或awk length RS='\\|END\\|'
在这里。请注意,正则表达式RS需要GAWK或mawk
另一种方法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
如前所述这里由沃尔特·蒙特,我们可以用一个实现这一ANSI C引号的字符串
sed $'s/|END|/\\\n/g'
~ $ echo 'T|somthing|something|END|T|something2|something2|END|' | sed
$'s/|END|/\\\n/g'
T|somthing|something
T|something2|something2
~ $
在上面的链接中查看其他替代方案。
您也可以使用以下语法,我不确定它是否适用于所有版本的Unix / Linux
sed 's/|END|/\'$'\n''/g'
~ $ echo 'T|somthing|something|END|T|something2|something2|END|' | sed
's/|END|/\'$'\n''/g'
T|somthing|something
T|something2|something2
~ $