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