Как найти текст и заменить эту строку, если существует с терминалом, в противном случае просто добавьте строку в конец

Я хочу вставить в sudo gedit /etc/sysctl.conf одну строку vm.swappiness=10, которую я иногда меняю.

По умолчанию эта строка не существует, поэтому я использую echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf.

Если бы я всегда ставил одну и ту же точную строку vm.swappiness=10, то в случае, если я хочу заменить, я мог бы использовать sudo sed -i 's/vm.swappiness=10/vm.swappiness=1/g' /etc/sysctl.conf Но , поскольку может быть vm.swappiness=12 или что-то еще, я хочу - только с одной командой - найти, существует ли в /etc/sysctl.conf строка, начинающаяся с vm.swappiness=. Затем, если он существует, я хочу удалить всю строку (затем, добавив && echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf к этой команде, он также впоследствии добавит новую строку конфигурации, которую я хочу до конца.

] Но, опять же, , поскольку в одной строке может быть много разных параметров, было бы нецелесообразно удалять их все, но было бы лучше изменить только число (непосредственно справа от vm.swappiness=. ]).

Что вы думаете? Было бы лучше найти vm.swappiness = x (x (x)) с 1-3 номерами (конечно, 100 также существует. ..), замените, если он есть (поместив его в переменную и используя команду, подобную `sudo sed -i 's/$oldline/$newline/g'), а если нет, просто добавьте vm.swappiness=10?

4
задан 22 November 2011 в 22:37

3 ответа

Вы можете использовать

sed 's/vm.swappiness=[0-9]*/vm.swappiness=1/g' /etc/sysctl.conf

, если не обращаете внимания на количество цифр в вашем номере.

Если вы хотите использовать не более 3 цифр, вам нужно расширенное (современное) регулярное выражение, а не базовые регулярные выражения (BRE). Затем вам нужно указать параметр "-E"

sed -E 's/vm.swappiness=[0-9]{1,3}/vm.swappiness=1/g' /etc/sysctl.conf
0
ответ дан 22 November 2011 в 22:37

Можно сделать такие замены с awk.

awk '/^vm.swappiness/ {print "replacement"; found=1} !/^vm.swappiness/ {print $0} END {if (!found) {print "appended" }}' filename

Параметр имени файла в конце является названием текстового файла, который содержит строки.

Вышеупомянутая команда заменяет любую строку, которая начинается wm.swappiness с replacement (измените к своей потребности). Иначе распечатывает исходные строки.

Если замена была сделана, ее помнят в found переменная. Таким образом, если никакая замена не была сделана, END блок добавляет одну строку с appended строка (это должно также быть изменено).

(Обратите внимание на то, что я не принимаю во внимание полномочия, это решает только замену, или добавьте проблему).

6
ответ дан 22 November 2011 в 22:37

Я делаю:

( sysctl vm.swappiness=10 ) > /dev/null

if [[ `grep "vm.swappiness=" /etc/sysctl.conf | wc -l` -eq 0 ]]; then
    echo "vm.swappiness=60" >> /etc/sysctl.conf
fi

sed -i -r 's~^vm.swappiness[[:blank:]]*=[[:blank:]]*[0-9]*$~vm.swappiness=10~' /etc/sysctl.conf
0
ответ дан 22 November 2011 в 22:37

Другие вопросы по тегам:

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