Как найти текст и заменить эту строку, если существует с терминалом, иначе просто добавьте строку в конец

Я хочу поместить в 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?

3
задан 23 November 2011 в 00:37

3 ответа

Вы можете использовать

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

, если не возражаете, сколько цифр у вас есть.

Если вы не хотите, чтобы вы не более трех цифр, вам нужно расширенное (современное) регулярное выражение, а не основные регулярные выражения (BRE). Затем вам необходимо указать параметр «-E»

sed -E 's/vm.swappiness=[0-9]{1,3}/vm.swappiness=1/g' /etc/sysctl.conf
3
ответ дан 25 May 2018 в 17:04
  • 1
    О, да, ваша линия хорошо подходит для изменения существующего, но что, если в нем нет самолета? как использовать это решение с нижеследующим решением? Чтобы выполнить тест, если существует, измените, если нет, тогда выполните то, что делает ваша строка. – Kangarooo 28 November 2011 в 01:37
  • 2
    идеальный, короткий и все, что нужно. Больше ничего нельзя добавить. находит точную строку с любым числом, содержащимся в настройках – Kangarooo 5 May 2014 в 01:56

Вы можете выполнять такие замены с помощью awk.

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

Параметр имени файла в конце - это имя текстового файла, содержащего строки.

Вышеупомянутая команда заменяет любая строка, начинающаяся с wm.swappiness с replacement (измените вашу потребность). В противном случае распечатываются исходные строки.

Если была сделана замена, она запоминается в переменной found. Таким образом, если замена не была выполнена, блок END добавляет одну строку с строкой appended (это также должно быть изменено).

(Обратите внимание, что я не принимаю во внимание разрешения, это решает только проблему замены или добавления).

5
ответ дан 25 May 2018 в 17:04
  • 1
    Это всегда добавляет меня. я также пробовал без ^ 4 вариантов (один / оба с / out ^) и до сих пор прилагает man awk | grep abc [abc...] character list, matches any of the characters abc.... [^abc...] negated character list, matches any character except abc.... %x, %X An unsigned hexadecimal number (an integer). The %X format uses ABCDEF instead of abcdef. /abc/ { ... ; f(1, 2) ; ... } – Kangarooo 8 November 2011 в 22:42
  • 2
    Не могли бы вы сравнить свой тест с моим, кажется, он работает для меня? pastie.org/2831658 – lgarzo 8 November 2011 в 22:46
  • 3
    О, извините за это! Я на самом деле не сконцентрирован на точном тексте, который нужно заменить, только на методе. Я отредактирую сообщение, чтобы исправить это. – lgarzo 8 November 2011 в 22:57
  • 4
    Мне приходят два метода: 1.) установить awk-переменные с помощью -v var=value, чтобы вы могли использовать их внутри скрипта awk. 2.) Или посмотрите этот вопрос: askubuntu.com/questions/76808/how-to-use-variables-in-sed (он демонстрирует, как вставлять переменные в строки с кавычками). – lgarzo 8 November 2011 в 23:05
  • 5
    Для обеспечения «замены» значение для awk-скрипта, который вы можете использовать: awk -v replacement="your_value" '/^vm.swappiness/ {print replacement; found=1} ...'. Обратите внимание на упущение котировок вокруг переменной замены после оператора печати и назначение -v для этой переменной. Вы можете использовать тот же метод для предоставления "добавленного" стоимость. – lgarzo 10 November 2011 в 21:17

Я делаю:

( 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
0
ответ дан 25 May 2018 в 17:04

Другие вопросы по тегам:

Похожие вопросы: