使用 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下面的两个来完成

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/将整行替换为 中的字符串`...'。反引号需要转义,因为该表达式位于双引号内(否则它将是 shell 中命令替换的开始)。

您还可以分两步提取路径:删除反引号之前的所有内容(包括反引号),然后删除单引号之后的所有内容(包括单引号)。这甚至可能看起来更整洁:

$ 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,我们将引号和反引号更改为换行符。然后路径夹在两个换行符之间。

相关内容