gpt4 book ai didi

sed - 用多行sed提取以单引号结尾的字符串

转载 作者:行者123 更新时间:2023-12-01 09:09:54 26 4
gpt4 key购买 nike

我有许多M4宏文件,如果有的话,我希望从中提取文件路径的单个实例。

每个文件中只有一行

define(`XSETROOT', `some_command with parameters SOME_DIR/subdir1/subdir2/filename')

或分布在两行上
define(`XSETROOT', dnl
`some_command with parameters SOME_DIR/subdir1/subdir2/filename')

或根本没有任何条目。

所以我希望找到开始的那条线
define(\`XSETROOT',

然后从同一行或下一行提取由“空格”和“单引号”界定的字符串,即
SOME_DIR/subdir/subdir/filename

可以不借助多个sed调用来完成此操作吗?

其他信息(以下注释字段中的格式似乎无效)-

在所有情况都在同一行上的简单情况下,可以通过适当的引用/取消引用来克服引号问题,并且此表达式有效
sed -ne 's|define(`XSETROOT'\'',.*`.* \(.*\)'\''.*|\1|p' file.m4

更多信息 -

多亏了MvG展示了如何进行多行处理的响应,当数据分成两行时,此表达式有效
sed -ne '/define(`XSETROOT/{n;s|`.* \([^'\'']*\)'\'').*|\1|p}' file.m4

但是问题仍然存在,是否有可能构造一个表达式来处理一行或两行中的数据,或者我是否必须尝试一个以查看是否返回了字符串,如果不是,则尝试另一个以查看如果返回一个字符串?

最佳答案

试试这个:

sed -n "/define(\`XSETROOT'/{/dnl/N;s/.* //;s/'.*//;p}"
  • 不执行任何操作,除非当前行包含define(`XSETROOT'
  • 如果该行还包含dnl,则追加下一行。
  • 删除所有内容,直到最后一个空格。
  • 删除最后一个单引号之后的所有内容。
  • 打印剩余的字符串。

  • N命令限制为实际上存在 dnl的情况有两个目的:它允许在文件末尾匹配单个行定义,并且允许两个后续定义,其中第一个仅占用一行。

    关于sed - 用多行sed提取以单引号结尾的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12270898/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com