
Я пытаюсь использовать sed, чтобы удалить остаток строки после: HTTP1.1" 200
Я не могу понять, как заставить sed понять, что мне нужно сопоставить все это как строку, включая двойные кавычки и пробел.
Хочу привести пример для верности:
"GET /images/loading.gif HTTP/1.1" 200 10819 "https://...
в
"GET /images/loading.gif HTTP/1.1" 200
решение1
Вам нужно заключать строки в кавычки с пробелами, когда вы используете sed (или большинство других инструментов) из командной строки. И поскольку вы уже используете двойные кавычки, вам нужно перейти на одинарные кавычки:
echo '"GET /images/loading.gif HTTP/1.1" 200 10819 "https://...' | \
sed 's|HTTP/1.1" 200.*|HTTP/1.1" 200|'
дает:
"GET /images/loading.gif HTTP/1.1" 200
решение2
С помощью GNU grep:
| grep -o '.*HTTP/1\.1" 200'
С помощью GNU sed:
| sed -r 's/(.*HTTP\/1\.1" 200).*/\1/'
решение3
Если вы просто добавите разделитель новой строки после вашей совпавшей строки, вы можете P
печатать только часть пространства шаблона, не изменяя его слишком сильно. Это обычно может работать даже тогда, когда пространство шаблона содержит байты, которые не являются частями символа.
sed -n 's|HTTP/1.0” 200|&\n|;P' <in >out
примечание: в переносимом варианте вам придется использовать буквальный символ новой строки вместо использованного n
выше, хотя он работает так, как написано в GNUsed