如何在所有行的末尾附加一个字符串?

如何在所有行的末尾附加一个字符串?

我试图在文本文件的所有行末尾添加一个字符串,但是某处出现了错误。

例子:

我在文本文件中有这个:

begin--fr.a2dfp.net
begin--m.fr.a2dfp.net
begin--mfr.a2dfp.net
begin--ad.a8.net
begin--asy.a8ww.net
begin--abcstats.com
...

我跑:

sed -i "s|\x0D$|--end|" file.txt

我得到:

begin--fr.a2dfp.net--end
begin--m.fr.a2dfp.net--end
begin--mfr.a2dfp.net--end
begin--ad.a8.net
begin--asy.a8ww.net--end
begin--abcstats.com
...

该字符串仅添加到某些行中,而不会添加到其他行中。

知道为什么吗?

答案1

\x0D是回车符,它可能在您的文本编辑器中可见也可能不可见。因此,如果您在 Windows 和 Unix/Linux 系统中编辑了文件,则可能会出现换行符的混合。如果您想可靠地删除回车符,您应该使用dos2unix。如果您确实想在行尾添加文本,只需使用sed -i "s|$|--end|" file.txt

答案2

有多种方法可以做到这一点:

  1. Perl

    perl -i -pe 's/$/--end/' file.txt
    
  2. sed

    sed -i 's/$/--end/' file.txt
    
  3. awk

    awk '{$NF=$NF"--end"; print}' file.txt > foo && mv foo file.txt
    
  4. while IFS= read -r l; do 
     echo "$l""--end"; 
    done < file.txt > foo && mv foo file.txt
    

答案3

您可以尝试使用ex

ex +"%s/$/--end/g" -cwq foo.txt 

相当于vi -e

该选项-i在 Linux 和 Unix 之间不太兼容,并且可能无法在其他操作系统上使用。

相关内容