sed中有一些方法可以从单个输入行创建多条输出线吗?我有一个模板文件(有多个文件中的行,我只是简化IT):来自sed的多条线
http://hostname:@[email protected]
我目前使用SED与实端口来代替PORT @ @。不过,我希望能够通过多个端口,并且让sed为每个端口创建一行。那可能吗?
sed中有一些方法可以从单个输入行创建多条输出线吗?我有一个模板文件(有多个文件中的行,我只是简化IT):来自sed的多条线
http://hostname:@[email protected]
我目前使用SED与实端口来代替PORT @ @。不过,我希望能够通过多个端口,并且让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.in
的URL,并将用printf
格式化字符串替换端口占位符,然后为读取的每个端口号打印一次URL。如果以错误的顺序输入文件,它将无法做正确的事情。
类似的解决方案,但是从一个shell变量取的网址:
$ 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
看来你有多个模板和多个端口,以适用于他们。以下是如何在shell脚本中执行此操作(使用bash进行测试),但如果您想保持简单,因为您有两个多值输入,则需要在两次执行中执行此操作。它在数学上是模板和替代值的交叉产物。
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"
shell变量元是元sed脚本,因为它把另一个sed脚本。 h将模式缓冲区保存在sed保存空间中。从元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/