<>閉じた文字列をテキストファイルの同じ文字列の先頭にある$記号で置き換えます。

<>閉じた文字列をテキストファイルの同じ文字列の先頭にある$記号で置き換えます。

次のようないくつかのプレースホルダーを持つLinuxシステムにはいくつかのファイルがあります。

テスト.txt:

This is a line with <VARIABLE1>@<VARIABLE2>.
This is a line with <VARIABLE3>.
This is a line with <VARIABLE_UNKNOWN>.
This is another line contains a<b.

このファイルを次のように変更したいと思います。

This is a test line with $VARIABLE1@$VARIABLE2.
This is a test line with $VARIABLE3.
This is a test line with $VARIABLE_UNKNOWN.
This is another line contains a<b.

で終わるすべての変数には、<>大文字、数字、および下線のみが含まれます。

次の方法を使用することもできましたが、a<b代わりにa$b

file_contents=$(<$file_path)
file_contents=${file_contents//</$}
file_contents=$(echo "$file_contents" | tr -d '>')
echo "$file_contents" > test.txt

sedデバッグが非常に困難な複雑なコマンドを使用しないようにしています。この目標をどのように達成できますか?

ベストアンサー1

これは個々の行を単純に置き換えるだけなので、これを実行するsedコマンドは複雑ではありません。

$ sed -E 's/<([[:upper:][:digit:]_]+)>/$\1/g' file
This is a line with $VARIABLE1@$VARIABLE2.
This is a line with $VARIABLE3.
This is a line with $VARIABLE_UNKNOWN.
This is another line contains a<b.

-EまたはsedにPOSIX sedがない場合:

sed 's/<\([[:upper:][:digit:]_]\{1,\}\)>/$\1/g' file

あなたのsedがPOSIXと互換性がない場合新しいものを買うただし、この特定のタスクには次のことができます。

sed 's/<\([A-Z0-9_][A-Z0-9_]*\)>/$\1/g' file

〜のように@chrisdaviesが指摘しました。<VAR1>27しかし、それはおそらくあなたが実際に得ようとしなければならない結果ではないでしょう。その結果、$VAR127次のいずれかを実際に目指す必要があります。

$ sed -E 's/<([[:alnum:]_]+)>/${\1}/g' file
This is a line with ${VARIABLE1}@${VARIABLE2}.
This is a line with ${VARIABLE3}.
This is a line with ${VARIABLE_UNKNOWN}.
This is another line contains a<b.

$ sed -E 's/<([[:alnum:]_]+)>/"${\1}"/g' file
This is a line with "${VARIABLE1}"@"${VARIABLE2}".
This is a line with "${VARIABLE3}".
This is a line with "${VARIABLE_UNKNOWN}".
This is another line contains a<b.

出力で何をしたいかによって異なります。

FWIW通常、人々はテキストにプレースホルダ文字列があるときにそれらを置き換えません。名前シェル変数は次に置き換えられます。コンテンツシェル変数です。それ以外の場合は、最初にシェル変数名でテキストを生成できますが、テキストにプレースホルダを使用することはどういう意味ですか?

おすすめ記事