Я пытаюсь использовать регулярное выражение в сценарии bash, чтобы добавить charset=utf-8 к любой строке, содержащей «текст/что угодно», если он еще не существует. Чтобы строка выглядела точно так же, как «text/whatever; charset=utf-8», и это делается для каждой строки, которая соответствует шаблону и еще не имеет charset=utf-8.
Я пробовал следующее и множество его итераций:
'/mimetype.assign/,/)/ s/\(text/.*\)\(.*\)\(charset=utf-8\)\{0\}/\1\2 charset=utf-8\"\,/'
Результаты, которые я продолжаю получать от этого и его вариаций, неверны. Вот некоторые результаты, которые я получаю при использовании sed.js.org:
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css; charset=utf-8", charset=utf-8",
".html" => "text/html", charset=utf-8",
".htm" => "text/html", charset=utf-8",
".js" => "text/javascript", charset=utf-8",
".asc" => "text/plain;charset=utf-8", charset=utf-8",
".c" => "text/plain;charset=utf-8", charset=utf-8",
".cpp" => "text/plain;charset=utf-8", charset=utf-8",
".log" => "text/plain;charset=utf-8", charset=utf-8",
".conf" => "text/plain;charset=utf-8", charset=utf-8",
".text" => "text/plain;charset=utf-8", charset=utf-8",
".txt" => "text/plain;charset=utf-8", charset=utf-8",
".spec" => "text/plain;charset=utf-8", charset=utf-8",
".dtd" => "text/xml", charset=utf-8",
".xml" => "text/xml", charset=utf-8",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
Вы заметите, что он добавляет его к строкам, в которых его нет, но он настроен неправильно. Он также добавляет его к строкам, в которых он уже есть, и в любом случае неправильно настраивает его. Возможно, я слишком усложняю это, и я могу использовать более простой cmd регулярного выражения.
В приведенном ниже примере показан фрагмент файла, который я пытаюсь изменить. Вы заметите, что некоторые строки, содержащие «текст/что угодно», уже настроены правильно.
## MimeType handling
## -------------------
##
## Use the "Content-Type" extended attribute to obtain mime type if
## possible
##
mimetype.use-xattr = "disable"
##
## mimetype mapping
##
mimetype.assign = (
".ogg" => "application/ogg",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css; charset=utf-8",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain;charset=utf-8",
".c" => "text/plain;charset=utf-8",
".cpp" => "text/plain;charset=utf-8",
".log" => "text/plain;charset=utf-8",
".conf" => "text/plain;charset=utf-8",
".text" => "text/plain;charset=utf-8",
".txt" => "text/plain;charset=utf-8",
".spec" => "text/plain;charset=utf-8",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
# make the default mime type application/octet-stream.
"" => "application/octet-stream",
Заранее спасибо за вклад.
Честно говоря, я открыт для любых предложений по правильной настройке и форматированию файла.
Если в строке уже есть другая кодировка, хотите ли вы заменить ее на charset=utf-8
?
Так что я в основном ищу только этих ребят `.html" => "text/html", ".htm" => "text/html" и пытаюсь превратить их в ".html" => "text/ html;charset=utf8", ".htm" => "text/html;charset=utf8",
Я это понимаю. Но если он содержит text/plain;charset=windows-1852
, следует ли его заменить на text/plain;charset=utf-8
или оставить в покое?
извини, неправильно понял. все, что имеет «text/xxxxxxx», должно быть настроено на «text/xxxxxx; charset=utf-8», и только это. Итак, приведенный выше пример text/plain;charset=windows-1852 следует изменить на text/plain;charset=utf-8.
Используйте !
после указания адреса, чтобы исключить строки, которые уже содержат charset=utf-8
.
Затем измените свой шаблон, чтобы он перестал совпадать с символом "
.
sed '/charset=utf-8/!s#\("text/[^;"]*\)[^"]*#\1; charset=utf-8#'
Объяснение:
/charset=utf-8
сопоставляет строки с этой строкой.!
инвертирует совпадение, чтобы мы не обрабатывали эти строки\("text/[^;"]*\)[^"]*
соответствует от "text/
до следующего "
символа, захватывая все, что было до ;
..\1; charset=utf-8
заменяет это захваченной частью, за которой следует ; charset=utf-8
.В строке замены &
заменяется частью строки, соответствующей регулярному выражению.
Спасибо. Отличная работа. По сравнению с этим мои попытки выглядят как алфавитный суп. Можете ли вы дать мне краткое описание команды sed.
Я добавил пояснения, а также изменил команду после некоторого тестирования.
Вам не нужен /charset=utf-8/!
, поскольку, если он присутствует, он все равно будет заменен той же строкой.
@EdMorton Я сам понял это после написания кода, но решил оставить его, чтобы выразить намерения ОП.
Также полезно увидеть логику внесения изменений в строки, не соответствующие шаблону. В этом случае шаблон совпадает с результатом, но не всегда.
Обязательно ли использовать
sed
?awk
намного лучше, когда вам нужно проверить несколько условий строки, например./required/ && !/prohibited/
для соответствия строкам, которые содержатrequired
, но не содержатprohibited
.