ファイルのコマンドラインから文字列を検索して改行文字に置き換える方法

ファイルのコマンドラインから文字列を検索して改行文字に置き換える方法

CentOS 7.2のコマンドラインでテキストファイル内のすべてのテキスト文字列を置き換えたいです。

Search-string: ).\nPORT
Replacement-string: ). \n0 closed ports\nPORT

私はこれを他のツール(例えば、、、、…)を使って達成することができますが、sedそれを実行してコマンドを理解する簡単な方法が見つかりません(重要;-))。私にとって最大の問題は改行です。改行がなくても大丈夫です。awktrsed

説明を含む提案は大歓迎です。

編集済み

入力する

...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency). 
PORT   STATE SERVICE
21/tcp open  ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...

出力

...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency). 
0 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...

答え1

可能なアプローチです。

sed '/)\. $/ {
n                          
/^PORT/ i\
0 closed ports
}'

テスト

$ sed '/)\. $/ {
n                          
/^PORT/ i\
0 closed ports
}' < input
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency). 
0 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...

答え2

Nsedを使用してパターンスペースから次の入力行を抽出し、2行を同時に処理できます。

たとえば、表示されている場合は、次の行を条件付きでインポートし、両方のfoo行を置き換えます。 (連続行がfooこれを破ります。)

echo -e "asf\nfoo\nbar" | sed -e '/foo/N;s/o\nb/od\nc/'

また、GNU sedには、-z改行の代わりにNUL文字から「行」を区切るオプションがあります。これにより、改行にまたがるパターンを簡単に一致させることができますが、入力全体に対して文字列操作が一度に実行され、大きな入力では問題になる可能性があります。

もちろん、周辺構造も考慮する必要があります。編集を進める最善の方法に影響を与える可能性があるためです。

答え3

GNU sedの新しいバージョンは-zオプションをサポートしています。

通常、sedは行末(改行またはキャリッジリターン)まで文字列を読み取り、行を読み取ります。
バージョン 4.2.2 の GNU バージョン sed には、代わりに "NULL" 文字を使用する機能が追加されました。これは、レコード区切り文字としてNULLを使用するファイルがある場合に便利です。一部のGNUユーティリティは、「find . -print0」や「grep -lZ」など、新しい行の代わりにNULLを使用する出力を生成できます。

このオプションは、sedが別の行で機能するようにしたい場合に使用できます。

sed -z 's/)[.]\nPORT/). \n0 closed ports\nPORT/g' inputfile

入力例の後にはスペースがあります。(0.00090s latency).

関連情報