web-dev-qa-db-ja.com

行末にWordを追加する方法をbash?

私は次のようにファイルからいくつかのアドレスを取得するために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ループでラップすると、スペースが含まれているため、行全体に渡されません。では、どうすればよいですか?

11
Palace Chan

$は、次のように行に追加します。

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')
19
FatalError

awkを使用するのはどうですか?

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

デモ:

$ cat file
junk line
address=192.168.0.12:80
address=127.0.0.1:25
don not match this line

$ awk -F= '/address/{gsub(/:/," ");print $2,"eth0"}' file
192.168.0.12 80 eth0
127.0.0.1 25 eth0

または単にsedを使用します:

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

あなたに必要なのは:

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を使用してください。グーグル理由。

2
Ed Morton
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/stringToAdd/' "${TMP_FILE}" > filename
0
pedram bashiri

これは大丈夫ですか?

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

PSあなたはあなたのカット、tr(あなたの例ではgrepさ​​え)を1つのsed/awkコールにマージして、cmdlineをよりシンプルでより速くすることができます。

0
Kent

私は同じ答えを求めてここに来ましたが、上記のどれもそれほどきれいではありません

sed -i 's/address=.*/& eth0/g' file

Addressで始まる行をインラインで検索してsedで置き換え、同じ行と 'eth0'で置き換えます

例えば。

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
0
Calvin Taylor