使用sed插入换行符(\n)

All*_*lan 12 bash freebsd sed

我正在尝试将一些列表清理为格式正确的CSV文件以进行数据库导入.

我的起始文件看起来像是这样的,每个"线"跨越多行,如下所示

Mr. John Doe
Exclusively Stuff, 186 
Caravelle Drive, Ponte Vedra
33487. 
Run Code Online (Sandbox Code Playgroud)

我创建了一个sed清理文件的脚本(有很多"脏"格式,比如逗号之前/之后的双空格和空格). 问题是带有句号的Zip. 我想改变一个新行的那段时间,但我无法让它发挥作用.

我使用的命令是:

sed -E -f scrub.sed test.txt
Run Code Online (Sandbox Code Playgroud)

并且scrub.sed脚本如下:

:a
N
s|[[:space:]][[:space:]]| |g
s|,[[:space:]]|,|g
s|[[:space:]],|,|g
s|\n| |g
s|[[:space:]]([0-9]{5})\.|,FL,\1\n |g
$!ba
Run Code Online (Sandbox Code Playgroud)

我得到的是

Mr. John Doe,Exclusively Stuff,186 Caravelle Drive,Ponte Vedra,FL,33487n 
Run Code Online (Sandbox Code Playgroud)

如果认为Zip +.(句号)将是一个伟大的"分隔符"来使用替换,而我可以找到它,我似乎无法告诉它在那里放一个换行符.

我在网上找到的大部分内容都是用其他东西替换换行符(通常是删除换行符),但更换换行符并不多.我确实找到了这个,但它没有用: 如何在逗号后面插入换行字符`),(`用sed?

有什么我想念的吗?

更新:

我编辑了我的scrub.sed文件,将文字新行设为安装.它仍然无法正常工作

:a
N
s|[[:space:]][[:space:]]| |g
s|,[[:space:]]|,|g
s|[[:space:]],|,|g
s|\n| |g
s|[[:space:]]([0-9]{5})\.|,FL,\1\
|g
$!ba
Run Code Online (Sandbox Code Playgroud)

我得到的是(一线上的所有东西):

Mr. John Doe,Exclusively Stuff,186 Caravelle Drive,Ponte Vedra,FL,33487 Mrs. Jane Smith,Props and Stuff,123 Main Drive,Jacksonville,FL,336907  
Run Code Online (Sandbox Code Playgroud)

我的预期输出应该是:

Mr. John Doe,Exclusively Stuff,186 Caravelle Drive,Ponte Vedra,FL,33487
Mrs. Jane Smith,Props and Stuff,123 Main Drive,Jacksonville,FL,336907  
Run Code Online (Sandbox Code Playgroud)

daw*_*awg 32

sed上BSD不支持\n新行的表示(把它变成一个文字n):

$ echo "123." | sed -E 's/([[:digit:]]*)\./\1\n next line/'
123n next line
Run Code Online (Sandbox Code Playgroud)

GNU sed确实支持\n表示:

$ echo "123." | gsed -E 's/([[:digit:]]*)\./\1\nnext line/'
123
next line
Run Code Online (Sandbox Code Playgroud)

替代方案是:

使用单个字符分隔符,然后将其tr转换为新行:

$ echo "123." | sed -E 's/([[:digit:]]*)\./\1|next line/' | tr '|' '\n'
123
next line
Run Code Online (Sandbox Code Playgroud)

或者在sed脚本中使用转义的文字新行:

$ echo "123." | sed -E 's/([[:digit:]]*)\./\1\
next line/'
123
next line
Run Code Online (Sandbox Code Playgroud)

或使用awk:

$ echo "123." | awk '/^[[:digit:]]+\./{sub(/\./,"\nnext line")} 1'
123
next line
Run Code Online (Sandbox Code Playgroud)

或者使用支持的GNU sed \n

  • 是的,Solaris sed甚至更糟。如果不是简单的“ s / old / new /”,那么您会陷入混乱的符文的不同组合中,涉及每个标点符号,单个字母和蝙蝠侠符号,每个含义在sed-by-sed,box-按盒子 因此awk .... :-)。 (2认同)

Ed *_*ton 7

在sed中获取换行符的便携方式是反斜杠后跟一个文字换行符:

$ echo 'foo' | sed 's/foo/foo\
bar/'
foo
bar
Run Code Online (Sandbox Code Playgroud)

我保证通过使用awk而不是sed,可以更简单地解决整个问题.