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

标签 sed

我有许多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/

    相关文章:

    linux - 正则表达式在通过 ssh 的 sed 中不被接受

    LINUX AWK命令合并基因亚型

    linux - 为什么这个命令 'seq 6 | sed -n ' 0,/2/p' ' 在 macosx 中有效?

    bash - 使用 sed 如何在大字符串中的数字后放置空格

    bash - 如何将字符串转换为修改后的十六进制表示?

    shell - 在 shell 中覆盖原始文件中的一行

    bash - 如何使用@author 删除多行评论

    linux - 当数据由 | 分隔时,使用 uniq 实用程序从列表中获取唯一值

    html - 想要将大型 HTML 文件层次结构中的所有 <tt> 标记转换为 <code>

    linux - 将字符串替换为命令的输出,每次都不同