1

さて、次の形式の一連のコンテンツを含むファイルはほとんどありません。

[abc]           #4  *5
[pqr]           #3  *4
[xyx]           #5  *2

今、私はすべての出現を置き換える必要がありました

[xyx]          #3  *2

[xyx]          #1  *2

すべてのファイルで。

ここで問題となっているのは、[xyz] と #3 の間のスペースの存在です。この検索式を、次のようなスクリプトのコマンド ライン引数として使用することが 2 つあります。

searchExp=$1
repalaceExp=$2

echo $searchExp
echo $replaceExp

for i in `grep \'$searchExp\'` 
do
 sed 's/$searchExp/$replaceExp' $i > $i.new
done

引数を次のように渡していることを考えると、これで問題ないと思います。

./replace_script '^\[xyz\]          #3' '\[xyz\]          #1'

echo ステートメント int を見ると、スクリプトは検索式と relace 式のすべてのスペースを 1 つのスペースに減らします。

\[xyz\] #3

今、スペース文字を処理するために他のいくつかの代替手段を試しました

 1.   ^\[xyz\][ ]+#3

これはアンバランスな [ ] と叫んでいるので、正規表現エラーです

 2. ^\[xyz\]\s+#3 //as per few suggestion on SO

これは一致しません。

私が間違っているところがわかりますか?

編集:タイプミスを修正

4

2 に答える 2

4

より良い方法は、次のような後方参照で正規表現を使用することです。

searchExp='\(\[xyx\][[:space:]]*\)#5'
replaceExp='\1#1'
sed "s/$searchExp/$replaceExp/" <<%EOF%
[abc]           #4  *5
[pqr]           #3  *4
[xyx]           #5  *2
%EOF%
[abc]           #4  *5
[pqr]           #3  *4
[xyx]           #1  *2

変数を展開するには二重引用符が必要なことにも注意してください。

于 2012-05-24T15:15:24.980 に答える
0

echo常にスペースを減らすので、その出力を当てにしないでください。

あなたが本当に欠けているのはこれです:

sed 's/searchExp/replaceExp' $i > $i.new

実際には

sed "s/$searchExp/$replaceExp/" $i > $i.new

実際に行と一致していることを確認したい場合は、ループ内にecho(またはより適切にprintf)書き込むことができます。for

最後に、すべてのファイルで使用してインプレースsedで置き換える場合は、次のように記述できます。

searchExp=$1
repalaceExp=$2

sed -i "s/$searchExp/$replaceExp/" *
于 2012-05-24T15:04:20.220 に答える