使用 sed 插入换行符(n)

我试图擦洗成一个正确格式的 CSV 文件的数据库导入一些列表。

我的起始文件看起来像这样,每个“行”应该跨越多行,如下所示

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

我创建了一个 sed脚本来清理文件(有很多“脏”格式,比如逗号前后的双空格和空格)。我想改变一个新的行,但我不能得到它的工作期间。

我使用的命令是:

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 + 。(句号)将是一个很好的“分隔符”来使用替换,虽然我可以找到它,但我似乎不能告诉它在那里放一个换行符。

我在网上找到的大多数东西都是关于用其他东西替换换行符(通常是删除它们) ,但是没有多少是关于用换行符替换的。我确实找到了这个,但是不管用: 如何在’中的逗号后插入换行符,(’使用 sed?

我是不是遗漏了什么?

更新:

我按照指示编辑了我的 scrus.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
135622 次浏览

在 sed 中获取换行符的可移植方法是一个反斜杠后跟一个文字换行符:

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

但是,我保证对于整个问题有一个更简单的解决方案,那就是使用 awk 而不是 sed。

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

或者定义一个新的行:

POSIX:

nl='
'

BASH/zsh/其他支持 引用 ANSI C的程序:

nl=$'\n'

然后使用带有适当引号和转义符的 sed插入文字 \n:

echo "123." | sed 's/\./'"\\${nl}"'next line/'
123
next line

或使用 awk:

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

或者使用支持 \n的 GNU sed

以下是 Oracle Linux x8664的工作原理:

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

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

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

在匹配后添加一行。

Sed 命令可以在找到模式匹配之后添加新行。Sed 的“ a”命令告诉它在找到匹配之后添加一个新行。

Sed’/unix/a“ Add a new line”’file.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“ Add a new line”’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.