Bash:使用 sed 或 tr 将“”替换为换行符

Bash: Replacing "" with newline character, using sed or tr

我正在尝试以在每个 'line' 之后插入换行符的方式格式化输出,其中的行用双引号 ("") 表示。引号本身是临时的,将在后面的步骤中删除。

输入:

"a",1,"aa""b",2,"bb"

输出:

a,1,aa
b,2,bb

我试过:

sed 's/""/\n/'
sed 's/""/\/g'
tr '""' '\n'

但 tr 似乎替换了每个引号字符,而 sed 似乎将 \n 作为文本而不是换行符插入。我该怎么做才能完成这项工作?

echo '"a",1,"aa""b",2,"bb"' |awk -v RS='""' '{=} {gsub(/"/,"")}1'
a,1,aa
b,2,bb

或使用sed:

 echo '"a",1,"aa""b",2,"bb"' |sed -e 's/""/\n/' -e 's/"//g'   # OR sed -e 's/""/\n/;s/"//g'
a,1,aa
b,2,bb

awk解决方法:这里默认的记录分隔符由换行改为""。因此 awk 会在达到 "" 时考虑 EOL。

sed 解决方案:这里首先将 "" 转换为新行,第二个替换是从每行中删除 "

neech@nicolaw.uk:~ $ cat file.txt
"a",1,"aa""b",2,"bb"
neech@nicolaw.uk:~ $ sed 's/""/\n/' file.txt | tr -d '"'
a,1,aa
b,2,bb

正如 George Vasiliou 所建议的,如果你有 perl,你可以使用:

>  echo '"a",1,"aa""b",2,"bb"' | perl -pe 's/""/"\n"/g;s/"//g'

这避免了不可移植的 sed 问题。

或者一个蹩脚的 hack 版本。

用另一个字符替换“”,然后使用 tr(因为 tr 应该与 \n 一起使用)将其替换为 \n,然后删除后面的单个“。

所以你可以像这样用换行符替换“”:

sed 's/""/#/g' | tr '#' '\n'

接下来是:

> echo '"a",1,"aa""b",2,"bb"'| sed 's/""/#/g' | tr '#' '\n' | sed 's/\"//g'

您似乎在处理 POSIX sed,它不支持 \n 表示法。在模式中插入一个实际的换行符,或者:

sed 's/""/\
/'

或:

sed 's/""/\'$'\n''/'

例如:

sed 's/""/\
/' | tr -d \"

输出:

a,1,aa
b,2,bb