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

时间:2017-09-06 18:51:21

标签: bash sed freebsd

我正在尝试将一些列表清理成格式正确的CSV文件,以便导入数据库。

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

Mr. John Doe
Exclusively Stuff, 186 
Caravelle Drive, Ponte Vedra
33487. 

我创建了一个sed脚本来清理文件(那里有很多"脏"格式化如逗号之前/之后的双空格和空格)。 问题是具有句号的Zip。我想更改新行的句号,但我无法让它工作。

我使用的命令是:

sed -E -f scrub.sed test.txt

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

我得到的是

Mr. John Doe,Exclusively Stuff,186 Caravelle Drive,Ponte Vedra,FL,33487n 

如果认为Zip +。(句号)将是一个很好的"分隔符"在我能找到它的时候使用替换,我似乎无法告诉它在那里添加换行符。

我在网上发现的大部分内容都是用其他东西替换换行符(通常是删除换行符),但更换换行符并不多。我找到了这个,但它没有用:How to insert newline character after comma in `),(` with 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

我得到的是(一行中的所有内容):

Mr. John Doe,Exclusively Stuff,186 Caravelle Drive,Ponte Vedra,FL,33487 Mrs. Jane Smith,Props and Stuff,123 Main Drive,Jacksonville,FL,336907  

我的预期输出应为:

Mr. John Doe,Exclusively Stuff,186 Caravelle Drive,Ponte Vedra,FL,33487
Mrs. Jane Smith,Props and Stuff,123 Main Drive,Jacksonville,FL,336907  

4 个答案:

答案 0 :(得分:20)

BSD上的sed不支持新行的\n表示形式(将其转换为文字n):

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

GNU sed支持\n表示:

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

替代方案是:

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

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

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

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

或使用awk

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

或者使用支持\n

的GNU sed

答案 1 :(得分:5)

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

$ echo 'foo' | sed 's/foo/foo\
bar/'
foo
bar

我保证使用awk而不是sed来解决整个问题的简单方法。

答案 2 :(得分:0)

以下在Oracle Linux x8664上有效:

$ echo 'foobar' | sed 's/foo/foo\n/'
foo
bar

如果您需要每行匹配多个,则需要在末尾放置g,如下所示:

$ echo 'foobarfoobaz' | sed 's/foo/foo\n/g'
foo
barfoo
baz

答案 3 :(得分:0)

在比赛后添加一行。

在找到模式匹配后,sed命令可以添加新行。 sed的“ a”命令告诉它在找到匹配项后添加新行。

sed'/ unix /一个“添加新行””文件。txt

unix is great os. unix is opensource. unix is free os.

    "Add a new line"
    
    learn operating system.
    
    unixlinux which one you choose.
    
    "Add a new line"

在比赛前添加一行

sed命令可以在找到模式匹配项之前添加新行。 sed的“ i”命令告诉它在找到匹配项之前添加新行。

sed'/ unix / i“添加新行”” file.txt

"Add a new line"

unix is great os. unix is opensource. unix is free os.

learn operating system.

"Add a new line"

unixlinux which one you choose.