Я хочу поместить в 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
?
Вы можете использовать
sed 's/vm.swappiness=[0-9]*/vm.swappiness=1/g' /etc/sysctl.conf
, если не возражаете, сколько цифр у вас есть.
Если вы не хотите, чтобы вы не более трех цифр, вам нужно расширенное (современное) регулярное выражение, а не основные регулярные выражения (BRE). Затем вам необходимо указать параметр «-E»
sed -E 's/vm.swappiness=[0-9]{1,3}/vm.swappiness=1/g' /etc/sysctl.conf
Вы можете выполнять такие замены с помощью awk.
awk '/^vm.swappiness/ {print "replacement"; found=1} !/^vm.swappiness/ {print $0} END {if (!found) {print "appended" }}' filename
Параметр имени файла в конце - это имя текстового файла, содержащего строки.
Вышеупомянутая команда заменяет любая строка, начинающаяся с wm.swappiness с replacement (измените вашу потребность). В противном случае распечатываются исходные строки.
Если была сделана замена, она запоминается в переменной found. Таким образом, если замена не была выполнена, блок END добавляет одну строку с строкой appended (это также должно быть изменено).
(Обратите внимание, что я не принимаю во внимание разрешения, это решает только проблему замены или добавления).
Я делаю:
( 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