2

Cygwinでsedを使用して検索および置換しようとしています:

SRC_FOLDER_MAIN=bra
TGT_FOLDER_MAIN=tag

ただし、次の sed コマンドは機能しません。

sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' externals.txt > externals_mod.txt

たとえば、これは問題なく動作します (「bra」を「tag」に置き換えます):

sed 's/bra/tag/g' externals.txt > externals_mod.txt

私は何が欠けていますか?

Cygwin が問題なのでしょうか?

4

4 に答える 4

3

sed変数値に基づいて置換するには、二重引用符で囲み、. なしで単純な変数呼び出しを使用します{}。また、$externals*.txt正しいですか?ファイルを呼び出す場合は、その名前を入力してください。

sed "s/$SRC_FOLDER_MAIN/$TGT_FOLDER_MAIN/g" $externals.txt > $externals_mod.txt

それ以外の

sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' $externals.txt > $externals_mod.txt
于 2013-05-07T11:28:02.730 に答える
2

sed でシェル変数を渡す必要がある場合は、一重引用符から外す必要があります。次のように試してください。

sed 's/'${SRC_FOLDER_MAIN}'/'${TGT_FOLDER_MAIN}'/g' $externals.txt > $externals_mod.txt

'直前と直後${SRC_FOLDER_MAIN}と同様に注意してください${TGT_FOLDER_MAIN}

更新: 例

[[bash_prompt$]]$ cat log
we will replace aaaa with bbbb
[[bash_prompt$]]$ a=aaaa;b=bbbb
[[bash_prompt$]]$ sed 's/'${a}'/'${b}'/g' log > new_log
[[bash_prompt$]]$ cat new_log
we will replace bbbb with bbbb
于 2013-05-07T11:56:52.717 に答える
0

sed が置換で受け入れる文字に苦労している場合は、awk を使用してください。

SRC_FOLDER_MAIN=bra
TGT_FOLDER_MAIN=tag

awk -v src="$SRC_FOLDER_MAIN" -v tgt="$TGT_FOLDER_MAIN" '{gsub(src,tgt)}1' "$externals.txt" > "$externals_mod.txt"

これは、変数内の任意の文字で機能します。注意すべき唯一のことは、sed と同様に、「ソース」が正規表現として扱われるため、RE メタ文字 (「.」や「*」など) が意味を持つことです。それが問題である場合は、単純な awk ソリューションはありますが、同等の sed ソリューションはありません。

正規表現ではなく文字列を見つけて置き換える awk:

awk -v src="$SRC_FOLDER_MAIN" -v tgt="$TGT_FOLDER_MAIN" '
    idx = index($0,src) { $0 = substr($0,1,idx-1) tgt substr($0,idx+length(src)) }1
' "$externals.txt" > "$externals_mod.txt"
于 2013-05-07T11:41:07.187 に答える