从给出的简单示例中,您要保留的逗号是唯一后跟空格的逗号。
$: cat foo
Name,Age,Country,ID,Address,Category,DOB
John Doe,19,England,3653,Manchester, England,Main Worker,20-05-1995
Bill Mark,19, Australia,3653,Main Street, People Two, Perth,Main Worker,20-05-1995
Mark Home,19,USA,3653, Redmond, Ground Town, Main Street, Virginia,Main Worker,20-05-1995
$: sed -E 's/,(\S)/|\1/g' foo
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Main Worker|20-05-1995
Bill Mark|19, Australia|3653|Main Street, People Two, Perth|Main Worker|20-05-1995
Mark Home|19|USA|3653, Redmond, Ground Town, Main Street, Virginia|Main Worker|20-05-1995
这会扫描一个逗号后跟一个非空格,并记住后面的字符。
它将匹配的逗号(以及以下已保存的字符)替换为管道(以及以下已保存的字符)。它将忽略逗号后跟一个空格,因为它们与模式不匹配。
这仍然适用于所有提供的示例。
对于逗号后没有空格的情况,您将不得不重新构建该行。
$: cat foo
Name,Age,Country,ID,Address,Category,DOB
John Doe,19,England,3653,Manchester, England,Part Time Worker,20-05-1995
Bill Mark,19, Australia,3653,Main Street, People Two, Perth,Main Worker,20-05-1995
Mark Home,19,USA,3653, Redmond, Ground Town, Main Street, Virginia,Main Worker,20-05-1995
$: cat tst
while IFS=, read -a line; # read and split
do set -- "${line[@]}" # set as $1, etc
for i in 0 1 2 3; do printf "%s|" "$1"; shift; done; # print first 4
while (( 3 < $# )); do printf "%s, " "$1"; shift; done # all BUT last 3
printf "%s|" "$1" "$2" # last 2 get |
echo "$3" # last 1 gets \n
done<foo
$: ./tst
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Part Time Worker|20-05-1995
Bill Mark|19| Australia|3653|Main Street, People Two, Perth|Main Worker|20- 05-1995
Mark Home|19|USA|3653| Redmond, Ground Town, Main Street, Virginia|Main Worker|20-05-1995
请注意,这样做会保留字段上的前导空格。如果你想剥离那些你需要手动完成的,但你可以在整个文件中一次性完成:
sed -E 's/[|]\s+/\|/g' file
如果你真的想修剪所有字段上的所有前导/尾随空格 -
sed -E 's/^\s+//; s/\s+[|]\s+/\|/g; s/\s+$//;' file
例如:
$: ./tst| sed -E 's/[|]\s+/\|/g'
Name|Age|Country|ID|Address|Category|DOB
John Doe|19|England|3653|Manchester, England|Part Time Worker|20-05-1995
Bill Mark|19|Australia|3653|Main Street, People Two, Perth|Main Worker|20-05-1995
Mark Home|19|USA|3653|Redmond, Ground Town, Main Street, Virginia|Main Worker|20-05-1995