zsh sed расширение переменной специальными символами и сохранение их - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь сохранить строку в переменной, а затем развернуть эту переменную в команде sed.

Некоторые значения, которые я собираюсь ввести в переменную перед вызовом команды, будут иметь круглые скобки (с косой чертой и без косой черты перед левой круглой скобкой, но никогда не перед правой), новые строки и другие специальные символы. Кроме того, строка будет заключена в двойные кавычки в файле, в котором выполняется поиск, и я хотел бы использовать их для ограничения только запрашиваемой строкой.

Команда должна иметь возможность сопоставить с этими специальными символами в файле. Использование ОС zsh / Ma c, хотя, если бы команда была совместима с bash 4.2, это было бы хорошим бонусом. эхо для xargs тоже нормально. Кроме того, если для этого лучше всего подходит awk, мне не нужно использовать sed.

Что-то вроде ...

sed 's/"\"$(echo -E - ${val})\""/"${key}.localized"/g' "${files}"

Учитывая, что $ val - это переменная, описанная выше, $ key не имеет пробелов (но подчеркивает) & $ files - это массив путей к файлам (желательно совместимых с пробелами, но не обязательных).

Пример входных значений для $ val ...

... "something \(customStringConvertible) here" ...

... "something (notVar) here" ...

... "something %@ here" ...

... "something @ 100% here" ...

... "something for $100.00" ...

Пример выходных данных:

... "some_key".localized ...

Я использовал команду sed для замены приведенных выше примеров. Текст, которым я его перезаписываю, довольно прост.

Ключевая проблема, с которой я столкнулся, заключается в том, чтобы заставить команду соответствовать специальным символам вместо того, чтобы расширять их, а затем пытаться сопоставить.

Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 30 мая 2020

awk лучше, поскольку он предоставляет функции, которые работают с буквальными строками:

$ val='something \(customStringConvertible) here' awk 'index($0,ENVIRON["val"])' file
... "something \(customStringConvertible) here" ...

$ val='something for $100.00' awk 'index($0,ENVIRON["val"])' file
... "something for $100.00" ...

Вышеупомянутое было выполнено для этого входного файла:

$ cat file
... "something \(customStringConvertible) here" ...
... "something (notVar) here" ...
... "something %@ here" ...
... "something @ 100% here" ...
... "something for $100.00" ...

С sed вам придется следуйте инструкциям на Можно ли надежно избежать метасимволов регулярных выражений с помощью sed , чтобы попытаться подделать sed.

Неясно, какова ваша настоящая цель, поэтому отредактируйте свой вопрос, чтобы предоставить краткий, проверяемый образец ввода и ожидаемый результат, если вам нужна дополнительная помощь. Сказав это, похоже, что вы выполняете замену, так что, возможно, это то, что вы хотите:

$ old='"something for $100.00"' new='here & there' awk '
    s=index($0,ENVIRON["old"]) { print substr($0,1,s-1) ENVIRON["new"] substr($0,s+length(ENVIRON["old"])) }
' file
... here & there ...

или, если хотите:

$ old='"something for $100.00"' new='here & there' awk '
    BEGIN { old=ENVIRON["old"]; new=ENVIRON["new"]; lgth=length(old) }
    s=index($0,old) { print substr($0,1,s-1) new substr($0,s+lgth) }
' file

или:

awk '
    BEGIN { old=ARGV[1]; new=ARGV[2]; ARGV[1]=ARGV[2]=""; lgth=length(old) }
    s=index($0,old) { print substr($0,1,s-1) new substr($0,s+lgth) }
' '"something for $100.00"' 'here & there' file
... here & there ...

См. Как использовать переменные оболочки в сценарии awk? для получения информации о том, как я использую ENVIRON[] vs ARGV[] выше.

...