43

行の一部をsedに置き換えるにはどうすればよいですか?

この線

DBSERVERNAME     xxx

に置き換える必要があります。

DBSERVERNAME     yyy

値 xxx は異なる場合があり、dbservername と値の間に 2 つのタブがあります。この名前と値のペアは、構成ファイルの多数のペアの 1 つです。

次の後方参照で試しました:

echo "DBSERVERNAME    xxx" | sed -rne 's/\(dbservername\)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip'

その結果、エラーが発生しました: `s' コマンドの RHS の参照 \1 が無効です。

表現がおかしい?GNU sed を使用します。

4

7 に答える 7

10

Others have already mentioned the escaping of parentheses, but why do you need a back reference at all, if the first part of the line is constant?

You could simply do

sed -e 's/dbservername.*$/dbservername yyy/g'
于 2009-07-02T14:22:07.213 に答える
2

( and ) をエスケープしています。私はあなたがそれをする必要がないと確信しています。試す:

sed -rne 's/(dbservername)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip'
于 2009-07-02T13:53:10.047 に答える
1

This might work for you:

echo "DBSERVERNAME     xxx" | sed 's/\S*$/yyy/'
DBSERVERNAME     yyy
于 2011-11-17T22:29:16.360 に答える
1

一重引用符を使用するときは、エスケープしてはいけません。すなわち。

echo "DBSERVERNAME    xxx" | sed -rne 's/(dbservername[[:blank:]]+)([[:alpha:]]+)/\1 yyy/gip'
于 2009-07-02T13:53:43.540 に答える
1

親を逃がしてはいけません。試す:

echo "DBSERVERNAME    xxx" | sed -rne 's/(dbservername)[[:blank:]]+([[:alpha:]]+)/\1 yyy/gip'
于 2009-07-02T13:54:09.390 に答える
0

これを試して

sed -re 's/DBSERVERNAME[ \t]*([^\S]+)/\yyy/ig' temp.txt

またはこれ

awk '{if($1=="DBSERVERNAME") $2 ="YYY"} {print $0;}' temp.txt

于 2013-01-20T07:26:22.150 に答える