我有这个文件:
'dog', 'cat', 'horse', 'turtle'
我想将该行转换为:
dog
cat
horse
turtle
如果我只使用逗号作为分隔符和命令 tr 我可以这样做:
tr -s ',' '\n' < file
与输出
'dog'
'cat'
'horse'
'turtle'
但是当我用作', '
分隔符时,这不起作用:
tr -s '\', \'' '\n' < file
即使我使用双反斜杠来转义单引号,它仍然不起作用。我在终端中得到的唯一输出是>
.
如何正确转义单引号以获得所需的输出?
答案1
将输入视为带引号的 CSV,在每个逗号分隔符后添加可跳过的空格,并使用单引号而不是标准双引号作为引用字符,我们可以用来csvformat
重新格式化数据:
$ csvformat -S -q "'" -D $'\n' file
dog
cat
horse
turtle
这使用csvformat
with-S
跳过每个分隔符后的初始空白字符,-q "'"
将输入引用字符设置为单引号,然后-D $'\n'
将输出字段分隔符设置为换行符。
然后该文件将被重新格式化。
任何使用嵌入换行符的字段都将在输出中被引用,就像包含嵌入双引号的字段一样。
答案2
tr
适用于集合,而不适用于字符串。第一组中的每个第一符号被第二组中的第一符号替换,第一组中的第二符号被第二组中的第二符号替换,等等。
如果第二组的符号少于第一组,则第一组中没有正确配对的所有符号都将替换为第二组的最后一个符号。
你需要
tr -s "\', " '\n' < file
每个撇号、逗号和空格都替换为换行符,但 -s 选项将它们全部压缩到一个 LF 实例中。
答案3
$ awk -F"'" '{for (i=2;i<=NF;i+=2) print $i}' file
dog
cat
horse
turtle
答案4
使用sed
$ sed "s/\([^,]*\), /\1\n/g;s/'//g" input_file
dog
cat
horse
turtle