3

ファイル ( file1.txt) には/path1/|value1、(パスの後に値が続く) があります。その (一意の) パスを含む行を見つけて、値を変更する必要があります。したがって、行は次のようになります/path1/|value2

問題は/path1/value1とのvalue2部分が両方とも変数内に含まれていることです。

変数を使用しない場合は、使用できます (このページのおかげで):

sed '/path1/s/value1/value2/g' file1.txt > copyfile1.txt

(これにより、元のファイルのコピーが作成され、後で を使用して元のファイルを上書きできますmv。)

これは を検索しているだけですpath1。検索する/path1/には、次を使用できます。

sed '/\/path1\//s/value1/value2/g' file1.txt > copyfile1.txt

部分文字列の抽出に関するこの質問への回答を使用して/path1/、、value1およびvalue2部分を変数に入れることができます。

だから私の現在のコードは次のとおりです。

sed '/'"${PATH}"'/s/'"${PREVIOUS_VALUE}"'/'"${NEW_VALUE}"'/g' file1.txt > copyfile1.txt

しかし、PATH 変数にスラッシュが含まれているため、これは機能しません。hereの情報を使用して、最初に次のような置換を試みました。

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g')

最初に、FORMATTED_PATH代わりに使用されますPATHが、検索と置換は機能しません (エラー メッセージは表示されず、新しいファイルは空です)。そしてロギングFORMATTED_PATH = //path1//で(これは正しいと思います)。

スラッシュを含む変数を使用して、この検索と置換を行うにはどうすればよいですか?

この回答で、一重引用符を閉じ、変数を二重引用符で囲んでから、一重引用符を再度開く必要があることがわかりました。しかし、これはスラッシュでは役に立ちません。)

4

3 に答える 3

1

コードはほぼ正しかった。それ以外の:

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g')

私は持っていたはずです:

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\\\//g')

これにより、次の正しいログが生成されます。FORMATTED_PATH = \/path1\/

于 2012-11-12T16:24:21.713 に答える
1

awkも機能します:

awk -F '|' -v path="$paht" -v new="$new_value" '{
    if ($1 == path) {print path FS new}
    else {print}
}' file1.txt > copyfile1.txt

PATHまた、シェル変数にすべて大文字を使用しないでください。プログラムの検索に使用されるシェルの変数が消去されています。

于 2012-11-12T17:58:24.027 に答える
1

通常、sedsコマンド ( のようにs///) は、 以外のセパレータの使用をサポートしてい/ます。例えば:

$ echo '/path1/|value1' | sed 's,\(/path1/|\).*,\1value2,'
/path1/|value2
$

/これは、文字を含むファイル パス名を扱う場合に非常に便利です。

于 2012-12-11T08:41:04.657 に答える