sed backreference:获取每一行并将其附加到行尾

sed backreference:获取每一行并将其附加到行尾

我有一个包含以下内容的文件:

$ cat -n w
     1  Smith   John    12345   jsmith
     2  Jones   Robert  23456   rjones
     3  Green   Ralph   34567   rgreen
     4  Brown   Fred    45678   fbrown
     5  Orange  Mabel   56789   morang

我想获取每一行,然后在该行的末尾附加该行的相同文本。

示例我想要这个输出:

$ cat -n w
     1  Smith   John    12345   jsmith  Smith   John    12345   jsmith
     2  Jones   Robert  23456   rjones  Jones   Robert  23456   rjones
     3  Green   Ralph   34567   rgreen  Green   Ralph   34567   rgreen
     4  Brown   Fred    45678   fbrown  Brown   Fred    45678   fbrown
     5  Orange  Mabel   56789   morange Orange  Mabel   56789   morange

我研究了带有反向引用的 sed 命令,但是我无法让它工作

$ sed 's/(.*)/\t\1/' wider
sed: -e expression #1, char 12: invalid reference \1 on `s' command's RHS

答案1

sed使用布雷默认情况下,需要转义\(...\)才能捕获匹配:

LC_ALL=C sed 's/\(.*\)/\1\t\1/' <file

或使用-E启用埃雷(在 GNU sed 和 BSD sed 中可用,并将很快成为标准),所以你不能逃避(...)

LC_ALL=C sed -E 's/(.*)/\1\t\1/' <file

设置区域设置以C帮助您匹配无效的 unicode 字符。

但是,这是更好的工作paste

paste file file

或者awk

awk '{printf "%s\t%s\n", $0, $0}' <file

答案2

尝试这个:

sed 's/\(.*\)/\1\t\1/' <filename>

答案3

如果您不反对使用 awk,这里有一种方法:

awk '{print $0"\t"$0}'

相关内容