sed コマンドを使用して変数を返す

sed コマンドを使用して変数を返す

sed一部の文字を削除し、結果を変数として返すために使用しようとしています。しかし、私はそれを動作させることができないようです。以下は、私が試したこととそのエラーが発生することです。

PROJECT_DB_NAME=`sed -i "${var}"'s/[^a-zA-Z]//g'`

間違い sed:-iはstdinでは使用できません。

PROJECT_DB_NAME=`"$var" | sed -n 's/[^a-zA-Z]//g'`

間違い domain.com: コマンドが見つかりません

私は多くの例を見つけましたが、それらのどれも私が望むことを正確には実行しておらず、私は少し愚かな奴です。ありがとう

答え1

sedの変数値からアルファベット以外の文字を削除する必要はありませんbash。単純な変数置換も同じことを行います。

PROJECT_DB_NAME=${var//[![:alpha:]]}

[!a-zA-Z]代わりに使用したい場合は[![:alpha:]確かに可能です。

外部コマンドを使用してこれらの文字を削除するには、適切な操作(単一文字の翻訳)を正確に実行するより簡単なコマンドをtr代わりに使用します。sedtr

PROJECT_DB_NAME=$( tr -dc '[:alpha:]' <<<"$var" )

または、

PROJECT_DB_NAME=$( printf '%s\n' "$var" | tr -dc '[:alpha:]' )

このコマンドのマニュアルを参照してくださいtr

を使用すると、変数echoが表示される前に変数の内容が変更されることがありますsed。質問参照」なぜprintfがechoより優れているのですか?」。


最初のコードスニペット、

PROJECT_DB_NAME=`sed -i "${var}"'s/[^a-zA-Z]//g'`

ファイル名なしで実行されますsed。これはsed、データが標準入力を介して到着すると仮定します。エラーメッセージが示すように、この-iオプションは標準入力では使用できません。sedコードの前に変数値を追加することもできます。これにより、変数の値がsed編集コマンドとして解釈されます。

2番目のコードスニペット、

PROJECT_DB_NAME=`"$var" | sed -n 's/[^a-zA-Z]//g'`

"$var"これはパイプの左側にあるコマンドで実行しようとします。また、sed -nこれを使用すると、次の結果がsed得られます。いいえ変更されたデータはデフォルトで出力されます。

答え2

まあ、ここで答えを見つけました。 sedの結果を変数に割り当てる方法

この答えを見ましたが、最終的に間違って実装しました。だからこれは私が終わるものです:

PROJECT_DB_NAME=$( echo "$var" | sed 's/[^a-zA-Z]//g')

関連情報