5

I want to put in sudo gedit /etc/sysctl.conf the one line vm.swappiness=10 which I sometimes change.

By default this line doesnt exist so I use echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf.

If I would always be putting the same exact line vm.swappiness=10, then in case I want to replace I could use sudo sed -i 's/vm.swappiness=10/vm.swappiness=1/g' /etc/sysctl.conf But since there could be vm.swappiness=12 or something else, I want--with just a single command--to find if, in /etc/sysctl.conf, there exists line starting vm.swappiness=. Then if it does exist I want to remove the whole line (then by appending && echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf to that command, it would also subsequently add the new configuration line that I want to the end.

But again since there could be a lot of different parameters in one line, it wouldn't be good to delete it all, but would be better to change only the number (to the immediate right of vm.swappiness=).

What you think? Would it be better to search for vm.swappiness=x(x(x)) with 1 to 3 numbers (of course, 100 also exists...), replace if it's there (by putting it into a variable and using a command like `sudo sed -i 's/$oldline/$newline/g'), and if not then just append vm.swappiness=10?

Eliah Kagan
  • 119,640
Kangarooo
  • 5,223

3 Answers3

7

You can do such replacements with awk.

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

The filename parameter at the end is the name of the text file that contains the lines.

The above command replaces any line that begins with wm.swappiness with replacement (modify to your need). Otherwise prints out the original lines.

If a replacement was made, it is remembered in the found variable. Thus if no replacement was made, the END block appends one line with the appended string (this should also be modified).

(Please note that I am not taking into account the permissions, this is solving only the replacement or append problem).

lgarzo
  • 20,492
4

You can use

sed 's/vm.swappiness=[0-9]*/vm.swappiness=1/g' /etc/sysctl.conf

If you don't mind how many digits your number has.

If you want a maximum of 3 digits, you need extended (modern) regular expressions rather than basic regular expressions (BRE's). You then need to provide the -E parameter

sed -E 's/vm.swappiness=[0-9]{1,3}/vm.swappiness=1/g' /etc/sysctl.conf
1

I'm doing:

( 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
Alix Axel
  • 1,073