How can I remove the leading “Modeline” text with sed?
Asked by
QuietMaple47
I'm generating an X11 modeline in Bash with gtf and trying to process its output. The line looks like this:
Modeline "1440x800_60.00" 93.80 1440 1512 1664 1888 800 801 804 828 -HSync +Vsync
I extract the text between quotes into MODENAME, then run sed on it:
MODEName=$(echo "$LINE" | awk -F'"' '{print $2}')
MODELINE=$(echo "$MODENAME" | sed 's/^s*Modeline.+$//')
However, the text is not being removed. What is wrong with the regular expression or the command?
Answers
A compact approach is to extract the quoted mode name directly from gtf output:
`MODENAME=$(gtf "$WIDTH" "$HEIGHT" "$RATE" | sed -nE 's/^[[:space:]]*Modeline[[:space:]]+"([^"]+)".*$/1/p')`
This matches the Modeline line and prints only the value inside the quotes. Also quote variables when expanding them, and prefer `printf` over `echo` when predictable output matters.
Reply to this answer
There are two separate issues. First, standard sed uses basic regular expressions, where `+` is normally a literal plus sign. Use `.*` or enable extended regular expressions with `sed -E`:
`sed -E 's/^[[:space:]]*Modeline.+$//'`
But this expression removes the entire matching line, not just the word `Modeline`. To remove the prefix and keep the rest, use:
`sed -E 's/^[[:space:]]*Modeline[[:space:]]*//'`
Also, `s` is not portable in sed; use `[[:space:]]` instead.
Reply to this answer
Your `MODENAME` variable contains only the text inside the quotes, such as `1440x800_60.00`. It no longer contains `Modeline`, so there is nothing for the sed command to remove. If you want the mode name, your existing awk extraction is enough:
`MODENAME=$(awk -F'"' '{print $2}' <<< "$LINE")`
If you want to strip `Modeline` from the full gtf output, apply sed to `LINE` instead.
Reply to this answer
Add your answer
Answers are reviewed before publication.
Related Discussions