2016-07-05 11 views
1

sedには、単一の入力行から複数​​の出力行を作成する方法はありますか?私は現在、実際のポートとポート@ @置き換えるためにsedを使用しています複数の行と1つのsedと

http://hostname:@[email protected] 

:私は、テンプレートファイルを(より多くの行がファイルにありますが、私はちょうどそれを単純化しています)があります。しかし、私は複数のポートを渡すことができるようにしたいと思い、それぞれの行を作成sedを持っている。それは可能ですか?

答えて

0

各ポート番号に対して行全体を複製したいと仮定しています。その場合、URLにポート番号を交換すると考える方が簡単です:

$ cat ports.in 
1 
2 
3 
4 
5 

$ sed 's#^\([0-9]*\$)#http://hostname:\1#' ports.in 
http://hostname:1 
http://hostname:2 
http://hostname:3 
http://hostname:4 
http://hostname:5 

それを行うには他の方法は、周りのawkに簡単です:

$ cat url.in 
http://hostname:@[email protected] 

$ awk '/^[0-9]/ {ports[++i]=$0} /^http/ {sub(":@[email protected]", ":%d\n"); for (p in ports) printf($0, ports[p])}' ports.in url.in 
http://hostname:2 
http://hostname:3 
http://hostname:4 
http://hostname:5 
http://hostname:1 

これはports.inurl.inの両方を読み込みます行が数字で始まっている場合は、ポート番号がports.inであるとみなされます。そうでない場合、行がhttpで始まる場合、URLはurl.inであるとみなされ、ポートプレースホルダはprintfの書式設定文字列に置き換えられ、読み込まれたポート番号ごとに1回URLを出力します。ファイルの順序が間違っていれば、正しいことをすることができません。

同様のソリューションが、シェル変数からURLを取る:

$ myurl="http://hostname:@[email protected]" 
$ awk -v url="$myurl" 'BEGIN{sub(":@[email protected]", ":%d\n",url)} /^[0-9]/ {ports[++i]=$0} END {for (p in ports) printf(url, ports[p])}' ports.in 
http://hostname:2 
http://hostname:3 
http://hostname:4 
http://hostname:5 
http://hostname:1 
0

あなたがそれらに適用するために、複数のテンプレートと複数のポートを持っているようです。シェルスクリプト(bashでテスト済み)でそれを実行する方法はありますが、2つの乗算された値が入力されているため、単純なままにしたい場合は2回のsed実行で行う必要があります。これは、数学的には、テンプレートと代入値の外積です。

ports='80 
8080 
8081' 

templates='http://domain1.net:%PORT/ 
http://domain2.org:%PORT/ 
http://domain3.com:%PORT/' 

meta="s/(.*)/g; s|%PORT|\1|p; /p" 
sed="`echo \"$ports\" |sed -rn \"$meta\" |tr '\n' ' '`" 
echo "$templates" |sed -rn "h; $sed" 

シェル変数メタそれは別のsedスクリプトを書き込むためのメタsedスクリプトです。 hはパターンバッファをsed保留空間に保存します。 meta sedから生成されたsedコマンドは、各ポートの呼び出し、置換、および印刷を行います。これが結果です。

http://domain1.net:80/ 
http://domain1.net:8080/ 
http://domain1.net:8081/ 
http://domain2.org:80/ 
http://domain2.org:8080/ 
http://domain2.org:8081/ 
http://domain3.com:80/ 
http://domain3.com:8080/ 
http://domain3.com:8081/ 
関連する問題