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

时间:2017-04-27 10:56:50

标签: bash sed tr

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

输入:

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

输出:

a,1,aa
b,2,bb

我试过了:

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

但是tr似乎取代了每个引用字符,sed似乎插入\ n作为文本而不是换行符。我能做些什么才能做到这一点?

4 个答案:

答案 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'