Как заменить несколько вхождений шаблона с помощью sed

Я использую следующую команду для удаления окружающих пространств между ключами массива, которые являются строками или целыми числами в файлах PHP:

sed -ri "s/\[ ([0-9]+|(\x27|\x22).*(\x27|\x22)) \]/[\1]/g" file.php

Я думал, что я покрыл все базы, но он не работает, когда в одной строке есть несколько скобок массивов. Итак:

if ( $myarray[ 'id' ] == 7 && $myarray[ 'status' ] == true )

Становится следующим:

if ( $myarray['id' ] == 7 && $myarray[ 'status'] == true )

Когда это должно выглядеть так:

if ( $myarray['id'] == 7 && $myarray['status'] == true )

Это удаление пространства справа для первого набора скобок и пробела слева для второго набора.

Как изменить команду, чтобы она заменила пробелы между всеми скобками массива в каждой строке для всего файла?

One Solution collect form web for “Как заменить несколько вхождений шаблона с помощью sed”

Ваша проблема исходит от .* . Если вы соответствуете только любому персонажу, который не является «или a», он будет работать: sed -ri "s/\[ ([0-9]+|(\x27|\x22)[^\x27\x22]*(\x27|\x22)) \]/[\1]/g" file.php

Еще лучше (принять во внимание «или»):

 sed -ri "s/\[ ([0-9]+|(\x27|\x22)[^\2]*(\2)) \]/[\1]/g" file.php 
  • Замена нескольких звездочек в vi
  • Подсчет последовательных повторений определенного символа (например,)
  • Использование xargs для генерации ссылок
  • Сумма столбцов для строк, содержащих определенный член
  • sed, чтобы удалить все строки с рисунком и добавить строки в конце
  • Стирание в stdin всех экземпляров регулярных выражений, определенных в файле
  • Удалять повторяющиеся строки попарно?
  • Как вставить команду оболочки в выражение sed?
  • замените символ из строки, которая находится между первым и вторым поиском, используя sed или awk
  • новый шаблон, требуемый из входного файла с помощью sed или awk
  • Использовать команду sed с переменными
  • Linux и Unix - лучшая ОС в мире.