各行の終わりにテキストを追加します


90

Linuxコマンドラインを使用していて、

127.0.0.1
128.0.0.0
121.121.33.111

が欲しいです

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

同僚がそのためにsedを使用していたのを覚えていますが、sedのマニュアルを読んだ後でも、コマンドラインでそれを行う方法がはっきりしませんか?


2
すばらしい質問です。あなたがそれをどのように組み立てたかが大好きです。
Anthony Rutledge

回答:


139

あなたは次のようなものを使ってみることができます:

sed -n 's/$/:80/' ips.txt > new-ips.txt

あなたのファイル形式があなたがあなたの質問で説明したとおりであるならば。

s///置換コマンドの一致(発見)ファイル内の各行の終わり(使用して$文字を)してから(追加置き換え:80各行の終わりに。ips.txtファイルには、入力ファイルです...そしてnew-ips.txt新たに作成したファイルです(変更の最終結果。


また、(Vladによって指摘され、aragaerによって指定されたように)ポート番号がすでにアタッチされているIP番号のリストがある場合は、次のようなものを使用してみてください。

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt

したがって、たとえば、入力ファイルが次のようになっている場合(に注意してください:80

127.0.0.1
128.0.0.0:80
121.121.33.111

最終結果は次のようになります。

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

@Vladはい。しかし、OPの入力例では、IPのリストにポート番号があってはなりません。:)たとえあったとしても、OPはs///前に別のsed を実行して、各行の終わりにあるポート番号をすべて取り出すことができます。
summea 2013

1
わかりました、わかりやすくしています...多分、ポートが既に存在する行を除外する条件があるはずです。
ウラッド

3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer 2013

3
あなた自身の答えにそれを追加してください。ポートのある行を除外する提案はすでにコメントにあります。正確なコマンドを書いただけです。
aragaer 2013

2
ファイルにCRLFターミネーター:80が含まれている場合、次の行の先頭に追加されます。dos2unix必要に応じて、まずファイルで使用します。
djnz0feh

13

sedコマンドの簡潔なバージョン:

sed -i s/$/:80/ file.txt

説明:

  • sed s tream ed itor
    • -i i n-place(ファイルをインプレイス編集)
    • s s ubstitutionコマンド
    • /replacement_from_reg_exp/replacement_to_text/ ステートメント
    • $行末に一致します(replacement_from_reg_exp
    • :80すべての行の最後に追加するテキスト(replacement_to_text
  • file.txt ファイル名


12

(同じファイル内の)各行の終わりにテキストを追加する場合は、-iパラメーターを使用できます。次に例を示します。

sed -i'.bak' 's/$/:80/' foo.txt

ただし、-iオプションは非標準のUnix拡張であり、すべてのオペレーティングシステムで使用できるわけではありません。

したがって、exvi -e/ と同等vim -e)の使用を検討できます。

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

:80各行に追加されますが、空白行に追加される場合があります。

したがって、より適切な方法は、行に実際に数値が含まれているかどうかを確認してから追加することです。次に例を示します。

ex  +"g/[0-9]/s/$/:80/g" -cwq foo.txt

ファイルの形式がより複雑な場合は、ではなく適切な正規表現を使用することを検討してください[0-9]


0

テキストエディターを使用して、^M各行の終わりで(control-M、またはキャリッジリターン)を確認します。最初にそれらを削除してから、行の最後に追加のテキストを追加する必要があります。

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

0
  1. 後方参照技術を使用してこれを達成することもできます

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. このようなawkでも使用できます

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    

-1

sed -i 's / $ /、/ g' foo.txt

出力の最後にコンマを追加するためにこれを頻繁に行うので、簡単にコピーしてPython(またはfav lang)配列に貼り付けることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.