найти и заменить одно число другим

отредактируйте файл network /etc/network/interfaces. и добавьте PEERDNS="no" . Это работает в Fedora. Надеюсь, это сработает в Debian. Вы также можете использовать chattr. чтобы никто не мог изменить файл.

1
03.08.2017, 06:27
5 ответов

Я нашел ответ

sed -E 's/[-1] / 9/' file1 > file2

могу выполнить работу

-4
27.01.2020, 23:45
sed 's/-1/9/g' file > file2
1
27.01.2020, 23:45
sed -i 's/-1/9 /g' file
sed 's/-1/9 /g' file1 > file2
1
27.01.2020, 23:45

Сделать это безопасным образом:

sed -e '
   s/$/ /
   :a;s/ -1 / 9 /;ta
   s/.$//
' file1

где

  • s/$/ /вставить пробел в конце строки
  • :a;s/ -1 / 9 /;taсделать замену (пробел необходим, если -1 в конце строки)
  • s/.$//удалить пробел в конце строки
0
27.01.2020, 23:45

Ваша команда,

sed -ie 's/^[-1] /9 /' file1 > file2

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

  1. Он изменяет файл на месте -и создает резервную копию оригинала как file1e. Это происходит потому, что вы указываете sedиспользовать букву eв качестве резервного префикса при использовании -ie. Ваш файл file2будет пустым, так как результат будет записан обратно в file1.

  2. Ваше регулярное выражение ^[-1] ничего не соответствует. ^привязывает выражение к самому началу строки, а в данных примера, которые вы предоставили, символ в начале каждой строки — 0.

    • Исправление этого путем удаления ^не работает, потому что [-1]соответствует только одиночному символу, либо -, либо 1. Это означает, что выражение seds/[-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
0
23.04.2021, 20:52

Теги

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