Как заменить одну строку двумя строками с помощью sed в csh на BSD?

В итоге я получил задание cron, которое каждые 3 минуты касается файла на каждом cifsобщем ресурсе в mount, чтобы поддерживать соединение. .

На данный момент общие ресурсы доступны в обычном режиме:

cifs_keepalive:

#!/bin/bash

while read spot; do
   touch --no-create "${spot}/.cifs_keepalive"
done <<< "$(mount | awk '/cifs/{ print $3; }')"

/etc/cron.d/cifs_keepalive:

*/3 *   *   *   *   root    /home/bcait/bca_util/bin/cifs_keepalive >/dev/null 2>&1

Кредиты: я почерпнул идею из этого сообщения в блоге.

1
07.09.2017, 09:58
3 ответа

Предполагается, что оболочка csh:

Чтобы просто добавить строку после другой:

% sed '/line2/a\\
# new line here\
' file
line1
line2
# new line here
line3
line4

Чтобы вставить строку перед другой:

% sed '/line3/i\\
# new line here\
' file
line1
line2
# new line here
line3
line4

Замена строки двумя новыми строками с помощью команды s:

% sed 's/line2/&\\
# new line here/' file
line1
line2
# new line here
line3
line4

Протестировано на OpenBSD 6.1 с запущенными sedи cshиз базовой системы.

1
27.01.2020, 23:13

С GNU sed ваш код работает просто отлично:

$ sed -e 's/line2/line2\n#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

Однако для BSD sed \nне рассматривается как новая строка в замещающем тексте. Если у вас оболочка bash, хороший обходной путь — использовать $'...'для вставки новой строки:

$ sed -e $'s/line2/line2\\\n#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

В дополнение к поддержке bash, zsh и ksh $'.. .'.

Другой вариант — вставить настоящую новую строку:

$ sed -e 's/line2/line2\
#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4

ОБНОВЛЕНИЕ: В csh этот последний вариант требует дополнительных \:

% sed -e 's/line2/line2\\
#this line was added by sed/' file
line1
line2
#this line was added by sed
line3
line4
4
27.01.2020, 23:13

Похоже, вам действительно нужна команда a ppend. Используя Bash или любую оболочку, которая поддерживает $'\n'(, большинство делает):

sed $'/line2/a\\\n#this line was added by sed\n' file.txt

Или, что более читабельно, с помощью файла команд sed:

/line2/a\
#this line was added by sed

Чтобы показать полный метод:

$ cat file.txt 
line1
line2
line3
line4
$ cat sedfile 
/line2/a\
#this line was added by sed
$ sed -f sedfile file.txt 
line1
line2
#this line was added by sed
line3
line4
$ 
2
27.01.2020, 23:13

Теги

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