multiline sed提取以单引号终止的字符串

时间:2012-09-04 20:28:48

标签: 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',

然后从同一行或下一行中提取由“space”和“single quote”界定的字符串,即

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

但问题仍然存在,是否有可能构建一个表达式,它将使用一行或两行数据,或者我必须尝试查看是否返回了一个字符串,如果没有,则尝试另一个一个看看是否返回一个字符串?

3 个答案:

答案 0 :(得分:0)

如果你可以使用awk它可能对你有用:

awk -F "[`']" 'BEGIN { RS=")" } { print gensub(".* ","","g",$4) }' INPUTFILE

请参阅(几乎相同 - 因为Ideone.com不支持CLI参数)in action here

说明:

  1. -F "[`']"将字段分隔符设置为[`']的正则表达式(这两个引号字符中的任何一个)
  2. RS=")"设置记录分隔符,这样我们就可以拥有多行记录
  3. gensub(".* ","","g",$4)返回其中最后一个空格后第4个字段的所有内容

答案 1 :(得分:0)

试试这个:

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

N命令对实际存在dnl的情况的限制有两个目的:它允许单行定义在文件末尾匹配,并允许两个后续定义第一个只占一行。

答案 2 :(得分:0)

正确的解决方案是使用M4本身。

m4 -D XSETROOT='some suitable value with a/path/to/a/file' file.m4