我正在尝试以在每个“行”之后插入换行符的方式格式化输出,其中的行用双引号(“”)表示。引号本身是暂时的,将在后面的步骤中被删除。
输入:
"a",1,"aa""b",2,"bb"
输出:
a,1,aa
b,2,bb
我试过了:
sed 's/""/\n/'
sed 's/""/\/g'
tr '""' '\n'
但是tr似乎取代了每个引用字符,sed似乎插入\ n作为文本而不是换行符。我能做些什么才能做到这一点?
答案 0 :(得分:3)
echo '"a",1,"aa""b",2,"bb"' |awk -v RS='""' '{$1=$1} {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
解决方案:此处首先""
转换为新行,第二次替换是从每行删除"
。
答案 1 :(得分:3)
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
答案 2 :(得分:1)
您似乎正在处理POSIX \n
,它不支持sed 's/""/\
/'
表示法。在模式中插入一个实际的换行符:
sed 's/""/\'$'\n''/'
或者:
sed 's/""/\
/' | tr -d \"
E.g:
a,1,aa
b,2,bb
输出:
let options = {
fileUri : videoFullPath,
outputFileName : new Date().getTime().toString() + '.mp4',
outputFileType : this.videoEditor.OutputFileType.MPEG4,
saveToLibrary : true,
maintainAspectRatio : true,
width : 480,
height : 360,
videoBitrate : 500000,
audioChannels : 1,
audioSampleRate : 22050,
audioBitrate : 96000,
progress : (info: number) => {
console.log('Progreso: ' + info * 100 + '%');
}
};
this.videoEditor.transcodeVideo(options).then((pathTranscodedVideo: string) => {
console.log(pathTranscodedVideo);
}).catch(this.showErrorMessage);
答案 3 :(得分:-1)
根据George Vasiliou的建议,如果你有perl,你可以使用:
> echo '"a",1,"aa""b",2,"bb"' | perl -pe 's/""/"\n"/g;s/"//g'
这可以避免非便携式sed问题。
或者是一个糟糕的黑客版本。
替换""与另一个字符然后使用tr(因为tr应该与\ n一起工作)用\ n替换它然后删除单个"后。
所以你可以得到""替换为这样的换行符:
sed 's/""/#/g' | tr '#' '\n'
然后其余部分如下:
> echo '"a",1,"aa""b",2,"bb"'| sed 's/""/#/g' | tr '#' '\n' | sed 's/\"//g'