2016-07-05 68 views
1

sed中有一些方法可以从单个输入行创建多条输出线吗?我有一个模板文件(有多个文件中的行,我只是简化IT):来自sed的多条线

http://hostname:@[email protected] 

我目前使用SED与实端口来代替PORT @ @。不过,我希望能够通过多个端口,并且让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.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 
0

看来你有多个模板和多个端口,以适用于他们。以下是如何在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/