Intereting Posts
Изменение раскладки клавиатуры в LightDM Параллелизация sed дает разную производительность Фильтруйте текст ниже с помощью команд оболочки Восстановить форматированный раздел ext3 Msgstr "bash: невозможно создать временный файл для здесь-документа: на устройстве нет места" Возвышенная командная строка открывает его дважды Как проверить, присутствует ли какой-либо IP-адрес в файле с использованием сценариев оболочки? Перенос нескольких GPU на Windows 10 VM завершается с ошибкой перед загрузкой Скрипт Bash; оптимизация скорости обработки Кто-нибудь получил какие-либо показатели производительности, сравнивающие IIS и .NET с Cherokee и Mono? Как ssh в удаленном ящике, запустите команду и продолжайте ее работу после отключения Поддерживает ли bash поддержку, похожую на вилку C ()? Параллельный для долгого фильтра Управление сетевыми подключениями в Arch Linux Панель приборов отображается под открытыми окнами

Как заменить несколько вхождений шаблона с помощью 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 )

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

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

Ваша проблема исходит от .* . Если вы соответствуете только любому персонажу, который не является «или 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