Intereting Posts
Внутренний громкоговоритель не горит, когда я нажимаю кнопки увеличения и уменьшения громкости на наушниках Как завершить фоновый процесс? iptables позволяют вводить INPUT с определенного URL-адреса Прокрутка сенсорной панели перестала работать после обновления Debian 9 Есть ли glibc API, который может найти приложение для передачи по умолчанию для типа MIME в Linux? Выполнение нескольких команд в скрипте init.d Как я могу запустить этот запуск / init как пользователь без root? Синтаксическая ошибка при использовании sed для параллельной замены строки, специфичной для строки: {= s / _1 / _2 / =}? Читаемый Bash встроенный с многострочным Простой стандартный способ печати последней команды bash с меткой времени pulseaudio-эквалайзер сохраняет сброс при запуске Данные подмножества с awk Настройте wpa_supplicant.conf на скрытый SSID с помощью WPA2 / PEAP / MS-CHAPv2 Найдите шаблон в файле и переместите его в новые файлы по одному cron не выполняет команду с переменной

используя sed с амперсандом (&)

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

Here's my code: sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas 

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

Вопрос: Как заменить текст, содержащий амперсанды с командой sed?

& является специальным в заменяющем тексте: это означает «вся часть ввода, которая была сопоставлена ​​шаблоном», поэтому то, что вы здесь делаете, заменяет user=&uidX на user=user=&uidXsysuserid. , Чтобы вставить фактический амперсанд в текст замены, используйте \& .

Другое дело, что это неправильно . в шаблоне поиска обозначает любой символ (кроме новой строки), но . в конце текста замены буквальная точка. Если вы хотите заменить только строчную строку user=&uid. , защитить . с обратной косой чертой.

 sed -e 's/user=&uid\./user=\&sysuserid./g' 

Если вы хотите заменить какой-либо один символ и сохранить его в результате, поместите символ в группу и используйте \1 в замене для ссылки на эту группу.

 sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g' 

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

 sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g' 

т.е. «заменить u на sysuser между user=& и id. ».