有一个像这样的 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
这也可以:
例子:
$ 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)
| 归档时间: |
|
| 查看次数: |
94945 次 |
| 最近记录: |