sedコマンドを使用してテキストファイルからパスを抽出する

sedコマンドを使用してテキストファイルからパスを抽出する

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つの改行の間に挟まれます。

関連情報