我有很多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
但问题仍然存在,是否有可能构建一个表达式,它将使用一行或两行数据,或者我必须尝试查看是否返回了一个字符串,如果没有,则尝试另一个一个看看是否返回一个字符串?
答案 0 :(得分:0)
如果你可以使用awk
它可能对你有用:
awk -F "[`']" 'BEGIN { RS=")" } { print gensub(".* ","","g",$4) }' INPUTFILE
请参阅(几乎相同 - 因为Ideone.com不支持CLI参数)in action here。
说明:
-F "[`']"
将字段分隔符设置为[`']
的正则表达式(这两个引号字符中的任何一个)RS=")"
设置记录分隔符,这样我们就可以拥有多行记录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