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
我正在尝试以在每个 '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