Регулярное выражение в bash или sed

#php #regex #bash #ubuntu #sed

#php #регулярное выражение #bash #ubuntu #sed

Вопрос:

У меня есть регулярное выражение (PHP) для очистки строки из файла:

 return  preg_replace('/[^A-Za-z0-9  n )(,%\@!?#amp;;'"- ./"]/','', $string);
  

Я использую Ubuntu и хочу очистить содержимое файла с помощью bash или sed?
Как я могу это сделать?
Спасибо!

Комментарии:

1. Пожалуйста, поделитесь тем, что вы пытались увидеть, как мы можем вам помочь.

2. Что здесь значит очистить ? Что не так с текущим решением?

3. Текущее решение использует php. Я ищу что-нибудь, используя Ubuntu

4. Вы можете использовать то же регулярное выражение с sed . Скопируйте и вставьте его.

5. Вы можете запустить PHP-код в командной строке, используя «-r»: php -r 'echo preg_replace("/o/","e", "foot")."n";' . В вашем коде много кавычек, вам придется их экранировать.

Ответ №1:

Удаление символов, отличных от ASCII

Похоже, вы просто хотите удалить символы, отличные от ASCII (хотя вы пропускаете каждый из $*:<=>[]^_`{|}~ , и я не знаю, намеренно ли это). Есть несколько способов сделать это, включая команду, написанную специально для этой цели.

  • strings FILENAME
  • tr -cd '[trn -~]' < FILENAME
  • sed 's/[^trn -~]//g' FILENAME

strings Утилита делает это автоматически и отлично подходит для быстрой проверки содержимого двоичного файла с безопасным выводом для терминала. Вам может не понравиться способ разделения блоков текста с помощью разрывов строк.

Две другие команды берут список символов (включая диапазоны по коду символа) и удаляют их. В tr (сокращение от «перевести») -c опция получает дополнение к списку и -d означает удалять совпадения, а не переводить их. В sed (сокращение от «оптимизированный редактор») я выполняю s/// замену перевернутого набора символов, подобного тому, который вы использовали в своем PHP-коде, и заменяю каждое совпадение ( /g флаг соответствует gпо долям) пустой строкой.

Набор символов (хорошо, технически это неправильный термин для tr использования, например, вы не можете отрицать его как [^…] , но именно поэтому мы используем tr -c ) вызывает несколько пробелов (табуляция, возврат каретки, перевод строки), а затем определяет диапазон символов от пробела () до тильды ( ~ ), охватываемый кодами от U 0020 до U 007e.

Вы также можете столкнуться с [!-~] . Это сокращение для всех доступных для печати символов ASCII. Пробелы не доступны для печати, вот почему мне пришлось назвать их явно, хотя, по крайней мере, символ пробела (U 0020) непосредственно предшествует восклицанию ( ! , U 0021), так что я мог бы просто включить это в наш диапазон.

Удалите только перечисленные вами символы

Для этого требуется сохранить список, хотя я могу свернуть его, используя любые смежные коды символов:

 sed 's/[^trn -#%-) -9;?-Z\a-z]//g' FILENAME
  

Объяснение приведенного выше регулярного выражения. Сравните его с вашим регулярным выражением или с более полным регулярным выражением не в формате ASCII из предыдущего раздела (я добавил Latin-1 дополнительно к тестовому набору этой последней ссылки, чтобы вы могли видеть, что оно действительно чему-то соответствует).

На месте

Если вы хотите сохранить в тот же файл, вы можете выполнить, sed -i COMMAND FILENAME используя любую из s/// команд, перечисленных выше.