我想输入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
?
答案1
你可以使用以下方法进行替换awk。
awk '/^vm.swappiness/ {print "replacement"; found=1} !/^vm.swappiness/ {print $0} END {if (!found) {print "appended" }}' filename
这文件名最后的参数是包含行的文本文件的名称。
上述命令将替换以 开头的任何行wm.swappiness
(replacement
根据需要进行修改)。否则将打印出原始行。
如果进行了替换,则会将其保存在found
变量中。因此,如果没有进行替换,则该END
块会用字符串附加一行appended
(这也应该修改)。
(请注意,我没有考虑权限,这仅解决替换或附加问题)。
答案2
您可以使用
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
答案3
我正在做:
( 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