sedには、単一の入力行から複数の出力行を作成する方法はありますか?私は現在、実際のポートとポート@ @置き換えるためにsedを使用しています複数の行と1つのsedと
http://hostname:@[email protected]
:私は、テンプレートファイルを(より多くの行がファイルにありますが、私はちょうどそれを単純化しています)があります。しかし、私は複数のポートを渡すことができるようにしたいと思い、それぞれの行を作成sedを持っている。それは可能ですか?
sedには、単一の入力行から複数の出力行を作成する方法はありますか?私は現在、実際のポートとポート@ @置き換えるためにsedを使用しています複数の行と1つのsedと
http://hostname:@[email protected]
:私は、テンプレートファイルを(より多くの行がファイルにありますが、私はちょうどそれを単純化しています)があります。しかし、私は複数のポートを渡すことができるようにしたいと思い、それぞれの行を作成sedを持っている。それは可能ですか?
各ポート番号に対して行全体を複製したいと仮定しています。その場合、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.in
とurl.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
あなたがそれらに適用するために、複数のテンプレートと複数のポートを持っているようです。シェルスクリプト(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/