Добавьте charset=utf-8 к строке, содержащей «текст/<любой текст», где он еще не существует

Я пытаюсь использовать регулярное выражение в сценарии 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",

Заранее спасибо за вклад.

Обязательно ли использовать sed? awk намного лучше, когда вам нужно проверить несколько условий строки, например. /required/ && !/prohibited/ для соответствия строкам, которые содержат required, но не содержат prohibited.

Barmar 06.08.2024 17:28

Честно говоря, я открыт для любых предложений по правильной настройке и форматированию файла.

KBriz 06.08.2024 17:31

Если в строке уже есть другая кодировка, хотите ли вы заменить ее на charset=utf-8?

Barmar 06.08.2024 17:57

Так что я в основном ищу только этих ребят `.html" => "text/html", ".htm" => "text/html" и пытаюсь превратить их в ".html" => "text/ html;charset=utf8", ".htm" => "text/html;charset=utf8",

KBriz 06.08.2024 18:00

Я это понимаю. Но если он содержит text/plain;charset=windows-1852, следует ли его заменить на text/plain;charset=utf-8 или оставить в покое?

Barmar 06.08.2024 18:01

извини, неправильно понял. все, что имеет «text/xxxxxxx», должно быть настроено на «text/xxxxxx; charset=utf-8», и только это. Итак, приведенный выше пример text/plain;charset=windows-1852 следует изменить на text/plain;charset=utf-8.

KBriz 06.08.2024 18:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте ! после указания адреса, чтобы исключить строки, которые уже содержат 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.

KBriz 06.08.2024 18:19

Я добавил пояснения, а также изменил команду после некоторого тестирования.

Barmar 06.08.2024 18:27

Вам не нужен /charset=utf-8/!, поскольку, если он присутствует, он все равно будет заменен той же строкой.

Ed Morton 08.08.2024 19:40

@EdMorton Я сам понял это после написания кода, но решил оставить его, чтобы выразить намерения ОП.

Barmar 08.08.2024 21:45

Также полезно увидеть логику внесения изменений в строки, не соответствующие шаблону. В этом случае шаблон совпадает с результатом, но не всегда.

Barmar 08.08.2024 21:46

Другие вопросы по теме