Сложная команда sed с И / ИЛИ / НЕ

Вы можете упростить набор «похожих» sed замен до следующего:

cat replace.sh 
#!/bin/bash
replace () {
var=$2  
new_val=$3

sed -e "s/^$var *= *.*/$var = $new_val/; s/^$var [^=]*$/$var $new_val/" "$1" | grep $var 

}

replace test.conf setting1 value1new 
replace test.conf setting2 value2new  
replace test.conf setting3 value3new  
replace test.conf setting4 value4new

Использование :

bash replace.sh

Вывод:

setting1 value1new
setting2 = value2new
setting3 = value3new
setting4 = value4new
1
06.01.2016, 19:16
1 ответ

Эта версия пакета предполагает, что вы используете Grub Legacy (0,97), который в соответствии с этим: https://wiki.archlinux.org/index.php/Boot_loaders , не поддерживает UEFI. См. эту статью для других загрузчиков, которые можно использовать.

Также, чтобы избежать путаницы, пожалуйста, имейте в виду, что Arch называет Grub 2 «Grub» и Grub .97 «Grub Legacy».

-121--174004-

Один из быстрых способов сделать это:

echo "cd /home/user/Download" >> ~/.bashrc

Теперь каждый раз, когда вы открываете терминал, он сразу же выполнит cd/home/user/Download .

-121--184611-

Если вы настаиваете на использовании sed, можно использовать две последовательные команды s . Во избежание выполнения второй команды после первой в той же строке добавьте команду t между ними; пропускает все оставшиеся команды, если предыдущая команда s произвела замену.

sed -e "s/\"select[^\";]* where /&admin_id = '\$admin_id' and /" -e t \
    -e "s/\"select[^\"]*/& where admin_id = '\$admin_id' /" \
    -i  *.php

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

С помощью оператора perl можно использовать оператор non-gredy repeat для прекращения сопоставления в первом зарезервированном слове или конце запроса. Это все еще приблизительно, но немного более надежно. Perl также допускает, чтобы замена была произвольным выражением, которое конструирует последовательность замены (с суффиксом e после замены), поэтому мы можем поставить туда условное.

perl -i -p -e '
    s[("select.*?)(\b(?:where|group|having|order|limit|procedure|into|for|lock)\b|[;"]|$)]
     [$1 . " where admin_id = '\$admin_id' " . ($2 eq "where" ? "and" : $2)]e
' *.php

P.S. что ... «» $ admin _ id «»... выглядит как SQL-инъекция, ожидающая, если только $ admin _ id не может содержать ' (и я думаю, что плохо сформированные UTF-8 тоже могут быть проблематичными).

0
28.01.2020, 02:12

Теги

Похожие вопросы