如果存在终端,如何查找文本并替换该行,否则只需将行追加到结尾

Kan*_*ooo 4 command-line bash swap sed

我想放入有时会更改的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=)。

你认为呢?用 1 到 3 个数字搜索vm.swappiness=x(x(x))会更好吗(当然,100 也存在...),如果它存在就替换(通过将其放入变量并使用命令像`sudo sed -i 's/$oldline/$newline/g'),如果不是,则附加vm.swappiness=10?

lga*_*rzo 6

您可以使用awk进行此类替换。

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

最后的filename参数是包含这些行的文本文件的名称。

上面的命令替换wm.swappinessreplacement(根据您的需要修改)开头的任何行。否则打印出原始行。

如果进行了替换,则会在found变量中记住它。因此,如果没有进行替换,则END块会附加一行appended字符串(这也应该被修改)。

(请注意,我没有考虑权限,这只是解决替换或附加问题)。


Ben*_*gat 4

您可以使用

sed 's/vm.swappiness=[0-9]*/vm.swappiness=1/g' /etc/sysctl.conf
Run Code Online (Sandbox Code Playgroud)

如果您不介意您的号码有多少位。

如果您想要最多 3 位数字,则需要扩展(现代)正则表达式而不是基本正则表达式 (BRE)。然后您需要提供-E参数

sed -E 's/vm.swappiness=[0-9]{1,3}/vm.swappiness=1/g' /etc/sysctl.conf
Run Code Online (Sandbox Code Playgroud)

  • 哦,是的,你的线路很好,可以改变现有的,但如果不存在喷气机怎么办?如何将此解决方案与以下解决方案一起使用?要测试是否存在,如果不存在则进行更改,然后执行您的行的操作。 (2认同)