如何查找文本并用终端替换该行(如果存在),否则仅将行附加到末尾

如何查找文本并用终端替换该行(如果存在),否则仅将行附加到末尾

我想输入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.swappinessreplacement根据需要进行修改)。否则将打印出原始行。

如果进行了替换,则会将其保存在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

相关内容