如何用新行替换单词


11

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

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

我tryig更换|END|\n新行的sed。

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

但这会产生错误的输出,如下所示:

 T
 |
 s
 o
 m
 e
 ...

但是我想要的是:

T|somthing|something
T|something2|something2

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


Answers:


15

用这个:

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

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


需要注释\ n中的\:sed's / | END | / \\ n / g
Baazigar 2015年

@Baazigar不,AB写的是正确的(至少对于Linux,某些sed实现会发出\n)。该问题询问如何用|END|换行符代替而不是\n
吉尔(Gilles)'所以

换行符为“ \ n”。之所以需要\\ n,是因为\也是转义字符,因此,如果仅执行\ n,则说的是'转义此n个字符'。当您执行\\ n时,您的意思是“不要将下一个\视为逃脱。”。
Baazigar 2015年


5

您可以使用awk

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

3

另一个可能 命令并使用其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$0in命令替换:

awk '$0' RS="\|END\|" file

$1=$1将空格序列压缩为一个空格字符,如果第一个字段为0,则返回false。这没有意义。你可能想awk 1 RS='\\|END\\|'awk NF RS='\\|END\\|'awk length RS='\\|END\\|'在这里。请注意,正则表达式RS需要GAWK或mawk
斯特凡Chazelas

3

另一种方法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

1

如前所述这里沃尔特·蒙特,我们可以用一个实现这一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

~ $

在FreeBSD v10上工作。实际上,只有对我有用的方法。谢谢。
Sopalajo de Arrierez,

0

我在严格的posix shell中遇到了相同的问题,我使用未使用的char两次通过了

cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.