web-dev-qa-db-ja.com

ファイルではなく文字列変数でsedを使用します

私はそれが可能であると言われましたが、単一の実用的な例がなければ、sedは入力ファイルを必要とせずに文字列変数から読み取ることができます。私はまだそれを機能させていません。一般的な安全のために、$PATH変数を別の変数に書き込みます。これを混乱させるのは、これを行う方法を正確に知るまで他の問題が発生する必要がないからです。

以下を考慮してください。

~$x=$PATH
~$sed -i 's/:/ /g' $x

これは失敗します:そのようなファイルまたはディレクトリはありません。

私が試した他のいくつかはここにあります:

~$ sed -i 's/:/ /g' | (read x) 
sed: no input files
~$ sed -i 's/:/ /g' | (read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' | $(read x) 
sed: no input files
~$ sed -i 's/:/ /g' | $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
sed: no input files
~$ sed -i 's/:/ /g' < $(read $x) 
bash: read: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games': not a valid identifier
bash: $(read $x): ambiguous redirect
~$ sed -i 's/:/ /g' < read $x 
bash: read: No such file or directory
~$ sed -i 's/:/ /g' < (read x) 
bash: syntax error near unexpected token `('
~$ sed -i 's/:/ /g' < $((read x)) 
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: syntax error: operand expected (error token is "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' < $((read $x)) 
bash: read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: division by 0 (error token is "usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games")
~$ sed -i 's/:/ /g' << $((read $x)) 
> ;^C
~$ sed -i 's/:/ /g' << $(read $x)
> ;^C
~$ sed -i 's/:/ /g' $x
sed: can't read /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < $x
bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: No such file or directory
~$ sed -i 's/:/ /g' < echo $x
bash: echo: No such file or directory
~$ sed -i 's/:/ /g' |  echo $x
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
sed: no input files

これでも機能しますか? sedを使用できるようにするために、必要のないファイルを書き込む必要はありません。この特定の例では、~$x=$PATH ~$sed -i 's/:/ /g' $xが実際に期待どおりに機能した場合、次のようになります。

/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games

これを変数に割り当てて、ls $xのような将来のコマンドで使用できます

26
j0h

多分:

~$ x="$PATH"
~$ x="$(echo $x | sed 's/:/ /g')"
~$ echo "$x"
/usr/local/bin /usr/bin /bin /usr/local/games /usr/games
16
bolichep

これはsedとは関係なく、標準入力を読み取るプログラムに適用されます。とにかく、あなたが探していたのは

sed 's/:/ /g' <<<"$PATH"

別の変数に保存する理由はありません。この方法を使用しても、変数に保存されている値に影響はありません。そのためには、割り当て演算子(=)が必要です。上記で使用される構文は "here string" と呼ばれ、bash、ksh、およびzshに固有です。変数の値を、標準入力から読み取るプログラムへの入力として渡します。

&Lに関する回答 を作成しました。これには、このようなさまざまなシェル演算子がすべてリストされています。あなたが見てみたいかもしれません。

あなたもやったかもしれないことに注意してください

echo "$PATH" | sed 's/:/ /g' 

最後に、これにはsedはまったく必要ありません。すべてをbashで直接実行できます。

echo "${PATH//:/ }"

上記はbashの置換構造です。変数$var、パターンpat、および置換(rep)が与えられ、patのすべての出現をrepで置き換えるには、次のようにします。

echo "${var//pat/rep}"

単一のスラッシュを使用した同じものは、最初の出現のみを置き換えます。

echo "${var/pat/rep}"
35
terdon