次のsedコマンドは、Hello
各入力行の末尾にテキストを追加するのに役立ちます。
<complex_query> | sed "s,$,Hello,"
Output:
myvar1: Hello
myvar2: Hello
grep wow data.txt | cut -d: -f2
今では代わりに出力を使いたいです。Hello
どうやってこれができますか?
以下は私が試したがうまくいかないことです。
<complex_query> | sed "s,$,(grep wow data.txt | cut -d: -f2),"
期待される望ましい出力:
myvar1: <output of grep wow data.txt | cut -d: -f2 command>
myvar2: <output of grep wow data.txt | cut -d: -f2 command>
答え1
他のコマンドの引数でコマンドの出力(末尾の改行を除く)を使用するには、次のようにします。コマンドの置き換え1970年代後半、Bourneシェルに導入された機能です。
Bourneシェルでも構文は`cmd...`
。csh
(from)に基づいているような最新sh
および類似のシェルでは構文は反対です(以前のバージョンとの互換性のためにBourne構文もサポートしていますが)。sh
ksh
zsh
bash
ash
$(...)
rc
-like シェルの構文は次のとおりです。`{cmd...}
fish
シェルでは(cmd ...)
二重引用符内には使用できません。バージョン3.4.0以降、二重引用符でwhichを使用することもfish
サポートされています。$(cmd...)
コマンド置換は、多くの場合、コマンドの出力を異なるシェル間で別々に分割し、複数の引数がコマンドに渡され、一部(ほとんどのBourneに似たシェルを含む)は結果の単語に対してグロービング(!)を実行します。これは通常、(rc
shell²や<3.4.0³などではありません)二重引用符内にコマンド置換を置くことで回避できます。fish
だからここにあります:
POSIX様シェルまたは
fish
3.4.0+:<complex_query> | sed "s,\$,$(grep wow data.txt | cut -d: -f2),"
rc
- 貝に似ている:nl = ' ' <complex_query> | sed 's,$,'``($nl){grep wow data.txt | cut -d: -f2},
csh
/tcsh
:<complex_query> | sed "s,\$,`grep wow data.txt | cut -d: -f2`,"
fish
<3.4.0<complex_query> | sed 's,$,'(grep wow data.txt | cut -d: -f2 | string collect),
これ&
で、文字は\
コマンドの置き換え部分で特別なので(ここで使用されている区切り文字)と改行文字(改行文字が存在する可能性がある場合)と一緒にエスケープする必要があります。上記のように分けて脱出しました。)sed
s
\
,
csh
rc
バラより「sed」置換に挿入された文字列がすべてのメタ文字をエスケープするかどうかを確認する方法それについて。
別の方法は、特殊文字を心配することperl
なく使用することです。sed
<complex_query> | REPL="$(cmd...)" perl -lpe '$_ .= $ENV{REPL}'
(これはPOSIXに似たシェルを想定しています)
または、 perl
Collectcmd
の出力自体を許可することもできます(自分の出力を使用している`...`
場合は末尾の改行を切り捨てますchomp
)。
<complex_query> | perl -lpe 'BEGIN{chomp ($repl = `cmd...`)}; $_ .= $repl'
ksh93
最新バージョンは他のバージョンとは異なる形式mksh
もサポートしています${ ...; }
が、このようにfish
サブシェル環境を導入しません。
²クラスシェルには、強い引用符(内部的に拡張はできません)というrc
1つのタイプの引用符しかありません。分割のための区切り文字のリストを指定する構文を使用して(ここでは空白)、分割を防ぐことが'...'
できますが、これは後続の改行トリミングも防ぎます。``(){cmd ...}
``(sep1 sep2){cmd ...}
3 また、csh/tcsh では"`cmd ...`"
改行文字の分割が依然として行われます。