多数の M4 マクロ ファイルがあり、そこからファイル パスの 1 つのインスタンスが存在する場合はそれを抽出します。
各ファイルには、次のいずれかの単一行があります
define(`XSETROOT', `some_command with parameters SOME_DIR/subdir1/subdir2/filename')
または2行にまたがる
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 さんが複数行処理のやり方を教えてくれたおかげで、データが 2 行に分割されている場合、この式が機能します。
sed -ne '/define(`XSETROOT/{n;s|`.* \([^'\'']*\)'\'').*|\1|p}' file.m4
しかし、疑問が残ります。1 行または 2 行のデータで機能する式を構築することは何らかの方法で可能でしょうか。それとも、返された文字列があるかどうかを確認するために 1 つを試して、そうでない場合は別の行を試して確認する必要がありますか?それが文字列を返す場合は?