我正在尝试将一些列表清理成格式正确的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
答案 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
答案 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.