xargs sh -cで他のコマンドでawkを使用するための正しい構文

xargs sh -cで他のコマンドでawkを使用するための正しい構文

このコマンドを操作する方法:

ls * | xargs -I {} sh -c 'echo {}; awk '{print $1}' {} | uniq'

簡単な作業を行う必要があります。uniq最初の列のフォルダー内の各ファイルの名前と値を印刷します。

$シンボルは文字列シンボルの終わりとして認識され、引用符に関連しているため機能しません。

エラーメッセージ:

awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string

ベストアンサー1

2番目の一重引用符は、最初の一重引用符文字列を終了します'echo {}; awk '。次に、{print $1}引用符を解いて別の単一引用符で囲んだ文字列です' {} | uniq'。これは、構文を強調するすべてのエディタで明確でなければなりません。質問の構文の強調を見ると明確です。

ここで最も簡単なアプローチは、入れ子になった参照を完全に回避することです。 awkスクリプトをパラメータとしてsh

xargs -I {} sh -c 'echo "$1"; awk "$0"' '{print $1}' {} | uniq'

(また、{}スクリプトの内部をその引数に置き換えましたsh{}スクリプト内では絶対に使用しないでください。ファイル名ではなくシェル構文で解析されるため、シェル特殊文字を含むファイル名では致命的に失敗します。)

単一引用符リテラル内に一重引用符を効果的に含めるには、次のようにします'\''(正式には、一重引用符リテラルを終了し、前のバックフラッシュのために文字通り解釈される一重引用符を追加し、別の一重引用符リテラルを開始します.は次のようになります。

xargs -I {} sh -c 'echo {}; awk '\''{print $1}'\'' {} | uniq'

または、あるレベルでは一重引用符を使用し、別のレベルでは二重引用符を使用しますが、これはよりトリッキーです。

ls *(私の考えでは、あなたの言葉にならない命令は、非常に単純化された例にすぎません。)

おすすめ記事