one.txt
内容は次のとおりです。
Hi this is the first line in a file one.txt
cooler:some default cooler string `/var/log/cooler_x86_64_someos8.4/config.cf'
doing good nice!
all is well
Hi this is the lastline in a file one.txt
期待される出力
/var/log/cooler_x86_64_ubantu.8.24/config.cf
私は次のように必要です
cat one.txt | grep cooler | sed somergexp
言う:
はい、バックティック最初、一重引用符最後
`/var/log/cooler_x86_64_someos8.4/config.cf'
sed
次の2つを使用して行うことができます
sed 's:^.*\(`.*\)'\''.*$:\1:'| sed 's/`//'
sed
しかし、一度の呼び出しで完了する必要があります。
答え1
私はこの問題を解決できます。sed 's:[^/]*\(.*\)'\''.*$:\1:'
答え2
sed -n -r '/^cooler/s|.*['\''`"]([^'\''"`]+).*|\1|gp' one.txt
-n
無音
/^cooler/
モード
gp
- 出力結果
.*['\''`"]
- 引用符の前の文字グループ(''```)
([^'\''"`]+)
- 引用符の後の文字グループ(次の引用符(''```)を除く)
答え3
まず、関心のある線を選択してみましょう。行は次の文字列で始まりますcooler:
。
$ sed -e '/^cooler:/!d' file
cooler:some default cooler string `/var/log/cooler_x86_64_someos8.4/config.cf'
この式は、/^cooler:/!d
入力から一致しないすべての行を削除します/^cooler:/
。
次に、バックティックと引用符の間にある内容を抽出します。
$ sed -e '/^cooler:/!d' -e "s/.*\`\([^']*\)'.*/\1/" file
/var/log/cooler_x86_64_someos8.4/config.cf
この式はs/.*\`\([^']*\)'.*/\1/
行全体をの文字列に置き換えます`...'
。式が二重引用符内にあるので、バックティックをエスケープする必要があります(そうでない場合は、シェルでコマンドの置き換えが開始されます)。
2つのステップでパスを抽出することもできます。バックティックの前の内容(バックティックを含む)を削除し、一重引用符の後のすべての内容(単一引用符を含む)を削除します。この方法はよりきれいに見えるかもしれません。
$ sed -e '/^cooler:/!d' -e 's/.*`//' -e "s/'.*//" file
/var/log/cooler_x86_64_someos8.4/config.cf
答え4
$ sed -ne '
/^cooler:/y/`'\''/\n\n/
s/.*\n\(.*\)\n.*/\1/p
' one.txt
これはposix sedです。引用符とバックティックを改行文字に変更します。その後、パスは2つの改行の間に挟まれます。