sedの代替文字列はどのようにコマンドの出力になりますか?

sedの代替文字列はどのようにコマンドの出力になりますか?

次の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構文もサポートしていますが)。shkshzshbashash$(...)

rc-like シェルの構文は次のとおりです。`{cmd...}

fishシェルでは(cmd ...)二重引用符内には使用できません。バージョン3.4.0以降、二重引用符でwhichを使用することもfishサポートされています。$(cmd...)

コマンド置換は、多くの場合、コマンドの出力を異なるシェル間で別々に分割し、複数の引数がコマンドに渡され、一部(ほとんどのBourneに似たシェルを含む)は結果の単語に対してグロービング(!)を実行します。これは通常、(rcshell²や<3.4.0³などではありません)二重引用符内にコマンド置換を置くことで回避できます。fish

だからここにあります:

  • POSIX様シェルまたはfish3.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),
    

これ&で、文字は\コマンドの置き換え部分で特別なので(ここで使用されている区切り文字)と改行文字(改行文字が存在する可能性がある場合)と一緒にエスケープする必要があります。上記のように分けて脱出しました。)seds\,cshrc

バラより「sed」置換に挿入された文字列がすべてのメタ文字をエスケープするかどうかを確認する方法それについて。

別の方法は、特殊文字を心配することperlなく使用することです。sed

<complex_query> | REPL="$(cmd...)" perl -lpe '$_ .= $ENV{REPL}'

(これはPOSIXに似たシェルを想定しています)

または、 perlCollectcmdの出力自体を許可することもできます(自分の出力を使用している`...`場合は末尾の改行を切り捨てますchomp)。

<complex_query> | perl -lpe 'BEGIN{chomp ($repl = `cmd...`)}; $_ .= $repl'

ksh93最新バージョンは他のバージョンとは異なる形式mkshもサポートしています${ ...; }が、このようにfishサブシェル環境を導入しません。

²クラスシェルには、強い引用符(内部的に拡張はできません)というrc1つのタイプの引用符しかありません。分割のための区切り文字のリストを指定する構文を使用して(ここでは空白)、分割を防ぐことが'...'できますが、これは後続の改行トリミングも防ぎます。``(){cmd ...}``(sep1 sep2){cmd ...}

3 また、csh/tcsh では"`cmd ...`"改行文字の分割が依然として行われます。

おすすめ記事