在一个脚本中加入多个 sed 命令以处理 CSV 文件

Bor*_*Bor 43 sed csv

有一个像这样的 CSV 文件:

HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
Run Code Online (Sandbox Code Playgroud)

并寻找类似的结果:

HEADER
first, column|second "some random quotes" column|third ol' column
Run Code Online (Sandbox Code Playgroud)

换句话说,删除“FOOTER”、开头、结尾和周围的引号 |。

到目前为止,这段代码有效:

sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe
Run Code Online (Sandbox Code Playgroud)

如您所见,问题在于它创建了 4 个额外的文件。

这是另一个解决方案,其目标是不创建额外的文件并在单个脚本中执行相同的操作。它不能很好地工作。

#!/bin/ksh

sed '/begin/, /end/ { 
        /FOOTER/d
        s/^\"//
        s/\"$//
        s/\"|\"/|/g 
}' csv > csv4
Run Code Online (Sandbox Code Playgroud)

ter*_*don 60

首先,正如迈克尔所展示的,您可以将所有这些组合成一个命令:

sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1
Run Code Online (Sandbox Code Playgroud)

我认为某些sed实现无法应对,可能需要:

  sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1
Run Code Online (Sandbox Code Playgroud)

也就是说,看起来您的字段是由定义的,|并且您只想删除"整个字段,留下字段内的那些。在这种情况下,你可以这样做:

$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv 
HEADER
first, column|second "some random quotes" column|third ol' column
Run Code Online (Sandbox Code Playgroud)

或者,使用 GNU sed

sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv 
Run Code Online (Sandbox Code Playgroud)

你也可以使用 Perl:

$ perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv 
HEADER
first, column|second some random quotes column|third ol' column
Run Code Online (Sandbox Code Playgroud)


Mic*_*ant 18

这也可以:

sed 's/^"//; s/"|"/|/g; s/""$/"/'

例子:

$ echo '"this"|" and "ths""|" and "|" this 2"|" also "this", "thi", "and th""' | 
sed 's/^"//; s/"|"/|/g; s/""$/"/'
this| and "ths"| and | this 2| also "this", "thi", "and th"
Run Code Online (Sandbox Code Playgroud)

漂亮的版本

sed '
s/^"//
s/"|"/|/g
s/""$/"/
$d
'
Run Code Online (Sandbox Code Playgroud)

  • 但这将删除最后一行,无论其内容如何。如果没有`FOOTER`,它将删除想要的数据。 (3认同)