【发布时间】:2023-03-26 19:12:01
【问题描述】:
我正在尝试将一些列表清理为格式正确的 CSV 文件以进行数据库导入。
我的起始文件看起来像这样,每个“行”应该跨越多行,如下所示
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
【问题讨论】:
-
这里似乎工作得很好。使用相同的文件和脚本,我在最后用换行符重新格式化数据。将
\n\n放在 sed 脚本的倒数第二行中会给我两个换行符,正如预期的那样。 (但是,“Doe”和“Exclusively”之间没有逗号)。我在 Linux 上使用 (GNU sed) 4.4。您使用的是哪个版本/平台? -
我在 FreeBSD 上使用
sed -
啊,我明白了。如果可以的话,也许可以尝试使用 GNU sed?我还看到我在输出中得到了“,FL”,就像你从脚本中想要的那样。您确定您提供的输出来自您提供的脚本吗?
-
没错。我在尝试混淆真实数据时无意中删除了 FL。
-
考虑不要删除邮政编码后的换行符。将
s|\n| |g更改为s|\([^[:space:]]\)\n\([^[:space:]]\)|\1 \2|g以便仅转换后面带有字符的换行符。这样您就不必恢复未删除的内容。