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


30

私はそれが可能であると言われましたが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


1
x=$(echo "$x" | sed 's/:/ /g')
heemayl

回答:


16

多分:

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

@jOh --- sedここでは、「文字列変数」(?)ではなく、標準入力で作業していることに注意してください。
Rmano

私はsed
開発者に

4
@ j0hこれは何の関係もありませんsed。シェルが入力をリダイレクトする方法の問題です。sed入力ストリームを処理し、標準入力から読み取ります。ファイルであるかどうかは関係ありません。標準入力を経由する限り、何でも受け入れます。
テルドン

38

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

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

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

このようなさまざまなシェル演算子をすべてリストしたU&Lに関する回答を書きまし。ご覧になりたいかもしれません。

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

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

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

echo "${PATH//:/ }"

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

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

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

echo "${var/pat/rep}"

2
「bash replacement construct」に感謝します。Bash関数で「$ {1 / from / to}」を使用して、最初の引数を後続のパラメーターに変更できました。
AAAfarmclub
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.