Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash如何将单词附加到行尾?_Bash_Unix_Sed_Awk_Grep - Fatal编程技术网

Bash如何将单词附加到行尾?

Bash如何将单词附加到行尾?,bash,unix,sed,awk,grep,Bash,Unix,Sed,Awk,Grep,我在bash中执行了一个命令,从如下文件中检索一些地址: grep address file.txt | cut -d'=' -f2 | tr ':' ' ' 收益率: xxx.xx.xx.xxx port1 xxx.xx.xx.xxx port2 我想在这些输出行中的每一行都附加'eth0',然后理想地在结果上循环调用每一行的命令。我遇到的问题是在每一行的末尾都有一个额外的字符串。我试过: | sed -e 's/\(.+)\n/\1 eth0/g' 这不起作用。然后假设我得到了它,如果

我在bash中执行了一个命令,从如下文件中检索一些地址:

grep address file.txt | cut -d'=' -f2 | tr ':' ' '
收益率:

xxx.xx.xx.xxx port1
xxx.xx.xx.xxx port2
我想在这些输出行中的每一行都附加'eth0',然后理想地在结果上循环调用每一行的命令。我遇到的问题是在每一行的末尾都有一个额外的字符串。我试过:

| sed -e 's/\(.+)\n/\1 eth0/g'
这不起作用。然后假设我得到了它,如果我把它包装在for循环中,它就不会通过整行,因为它们包含空格。那我该怎么做呢?

这对你合适吗

kent$ echo "xxx.xx.xx.xxx port1
xxx.xx.xx.xxx port2"|sed 's/.*/& eth0/'
xxx.xx.xx.xxx port1 eth0
xxx.xx.xx.xxx port2 eth0

另外,您可以将cut、tr(在您的示例中甚至是grep)合并到一个sed/awk调用中,以使cmdline更简单、更快。

使用
awk
怎么样:

awk -F= '/address/{gsub(/:/," ");print $2,"eth0"}' file
演示:

或者只使用
sed

$ sed -n '/address/{s/:/ /g;s/.*=//;s/$/ eth0/p}' file
192.168.0.12 80 eth0
127.0.0.1 80 eth0

您可以匹配
$
以附加到行,如:

sed -e 's/$/ eth0/'
编辑:

要循环行,我建议使用
while
循环,如:

while read line
do
  # Do your thing with $line
done < <(grep address file.txt | cut -d'=' -f2 | tr ':' ' ' | sed -e 's/$/ eth0')
读取行时
做
#用$line做你的事情
完成<您只需要:

awk -F'[=:]' '{print $2, $3, "eth0"}' file.txt |
while IFS= read -r ip port eth
do
   printf "ip=%s, port=%s, eth=%s\n" "$ip" "$port" "$eth"
done

在使用read时始终使用IFS=和-r,除非您有非常具体的理由不这样做。谷歌搜索原因。

我来这里寻找相同的答案,但上面没有一个能像谷歌那样清晰

typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename
sed -i 's/address=.*/& eth0/g' file
用sed内联搜索并替换以address开头的行,替换为同一行加上“eth0”

例如


很酷,最后我如何循环结果呢?间距使我在每个单词上循环,而不是每行<代码>Bash
grep
cut
tr
sed
否否否。。。你想要的东西可以通过
sed
awk
单独实现。@sudo_O虽然我在某种程度上同意你的观点,但这真的没那么糟糕:P.在unix的血统中,有很多这样的小工具,这就是它们存在的原因。这太棒了,我总是忘记了
@FatalError UNIX并不是将大量的小实用程序链接在一起,而一个小实用程序就可以完成这项工作。输入文件是什么样子的?我看到这并没有按指示的每行调用任何东西,但这回答了标题问题。这里做什么?它基本上是从LHS到替换RHS的所有东西的简写。再看一看这个例子,或者自己试一试。=)这是伟大的前/后挂起。
sed -i 's/address=.*/& eth0/g' file
sed -i 's/address=.*/& eth0/g' file; cat file
junk line
address=192.168.0.12:80 eth0
address=127.0.0.1:25 eth0
don not match this line