отредактируйте файл network /etc/network/interfaces. и добавьте PEERDNS="no" . Это работает в Fedora. Надеюсь, это сработает в Debian. Вы также можете использовать chattr. чтобы никто не мог изменить файл.
Я нашел ответ
sed -E 's/[-1] / 9/' file1 > file2
могу выполнить работу
Сделать это безопасным образом:
sed -e '
s/$/ /
:a;s/ -1 / 9 /;ta
s/.$//
' file1
где
s/$/ /
вставить пробел в конце строки :a;s/ -1 / 9 /;ta
сделать замену (пробел необходим, если -1 в конце строки)s/.$//
удалить пробел в конце строки Ваша команда,
sed -ie 's/^[-1] /9 /' file1 > file2
не работает по двум основным причинам:
Он изменяет файл на месте -и создает резервную копию оригинала как file1e
. Это происходит потому, что вы указываете sed
использовать букву e
в качестве резервного префикса при использовании -ie
. Ваш файл file2
будет пустым, так как результат будет записан обратно в file1
.
Ваше регулярное выражение ^[-1]
ничего не соответствует. ^
привязывает выражение к самому началу строки, а в данных примера, которые вы предоставили, символ в начале каждой строки — 0
.
Исправление этого путем удаления ^
не работает, потому что [-1]
соответствует только одиночному символу, либо -
, либо 1
. Это означает, что выражение sed
s/[-1] /9 /
заменит первое выражение -
или 1
, за которым следует пробел в каждой строке, на выражение 9
, за которым следует пробел.
Добавление флага /g
в конец не поможет, так как это по-прежнему ошибочно заменит любое 1
, отличное от -1
, и, кроме того, не заменит -1
в самом конце строки. где нет завершающего пробела.
Вместо этого замените каждое -1
на 9
, а также будьте осторожны, не заменяя подстроку -1
чисел, например-10
:
sed 's/-1\>/9/g' file1 >file2
Выражение -1\>
будет соответствовать строке -1
везде, где она встречается без завершающих слов символов (букв или цифр ). Следовательно, не будет соответствовать -10
или -11
и т. д.
Поскольку вы, кажется, хотите записать результат в file2
, я не использую опцию -i
для редактирования места -. Мне также не нужно использовать опцию -e
для указания выражения sed
, так как есть только одно выражение.
Чтобы не беспокоиться о регулярных выражениях, у вас также есть возможность использовать awk
для замены чисел:
awk '{ for (i=1; i<=NF; ++i) if ($i == -1) $i = 9 }; 1' file1 >file2
Это перебирает каждое поле с разделителями -пробелами в каждой строке и заменяет каждое численно равное -1 на 9.
Это заменит разделитель полей в каждой измененной строке пробелом. Если вы хотите использовать другой разделитель, кроме пробела, установите переменную OFS
в командной строке :
awk -v OFS='\t' '{ for (i=1; i<=NF; ++i) if ($i == -1) $i = 9 }; 1' file1 >file2