Я хочу вставить в 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
, если не обращаете внимания на количество цифр в вашем номере.
Если вы хотите использовать не более 3 цифр, вам нужно расширенное (современное) регулярное выражение, а не базовые регулярные выражения (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