次の形式のテキストファイルがあります。
keyword value
keyword value
...
ここで、キーは単一の単語で、値は行が終了する前のすべての項目です。 (キーワードではなく)値をシェル拡張に適用して、シェルスクリプトからファイルを読みたいと思います。
sedを使用してキーワードと値の部分を簡単に一致させる
input='
keyword value value
keyword "value value"
keyword `uname`
'
echo "$input"|sed -e 's/^\([^[:space:]]*\)[[:space:]]\(.*\)$/k=<\1> v=<\2>/'
生産する
k=<keyword> v=<value value>
k=<keyword> v=<"value value">
k=<keyword> v=<`uname`>
しかし、問題は、sed式の代替部分にシェルコマンドを含める方法です。この場合は\1 `echo \2`
。
ベストアンサー1
GNU では、sed
次のコマンドを使用できます。
sed -nr 's/([^ ]+) (.*)/echo "\1" \2\n/ep' input
任意の出力:
keyword value value
keyword value value
keyword Linux
あなたの入力データとして。
説明する:
-n
通常の出力を抑制するには、sedコマンドでこのオプションを使用します。-r
パターンで特殊文字の一部のエスケープを防ぐ拡張正規表現を使用するには、渡しますが必須ではありません。
このs
コマンドは、入力行をコマンドに変換するために使用されます。
echo "\1" \2
キーワードは引用され、値は引用されません。 sedに代替コマンドをシェルコマンドとして実行し、その結果をパターンバッファ(複数行を含む)に読み込むように指示するコマンドにe
オプション(GNU関連)を渡します。コマンドの実行後にパターンバッファを印刷するには、after(!)オプションをs
使用します。p
e
sed