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