web-dev-qa-db-ja.com

すべての行の最後に文字列を追加するにはどうすればよいですか?

テキストファイルのすべての行の最後に文字列を追加しようとしていますが、どこかに間違いがあります。

例:

私はこれをテキストファイルに入れました:

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
...

文字列は特定の行にのみ追加され、他の行には追加されません。

なぜか?

5
rkifo

\x0Dはキャリッジリターンで、テキストエディタに表示される場合と表示されない場合があります。したがって、WindowsとUnix/Linuxシステムの両方でファイルを編集した場合、改行が混在する可能性があります。キャリッジリターンを確実に削除する場合は、dos2unixを使用する必要があります。本当に行末にテキストを追加したい場合は、sed -i "s|$|--end|" file.txtを使用してください。

10
l0b0

これを行うにはいくつかの方法があります。

  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
    
4
terdon

ex を使用してみてください:

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

これはvi -eと同等です。

オプション-iはLinuxとUnixの間で完全に互換性がなく、他のオペレーティングシステムでは使用できない場合があります。

0
kenorb