как заменить значение вычислением в bash/sed

cat не добавляют новые строки. Новая строка уже присутствует в конце test1. Это нормально: текстовый файл состоит из последовательности строк, и строка состоит из последовательности печатаемых символов, сопровождаемых символом новой строки. Таким образом все непустые текстовые файлы заканчиваются символом новой строки.

Если у Вас есть два текстовых файла, и Вы хотите связать их вместе, использовать cat. Вы получите строки первого файла, сопровождаемого строками второго файла.

Если Вы хотите сделать, что-то более сложное, то есть, присоединяется к последней строке первого файла с первой строкой второго файла, Вам нужна более сложная команда. Например, можно лишить последний знак первого файла и добавить второй файл. С GNU coreutils (т.е. на невстроенном Linux), можно сделать это:

{ <test1 head -c -1 && cat test2; } >test3

или на двух шагах:

<test1 head -c 1 >test3 && <test2 cat >>test3
2
02.07.2013, 18:07
4 ответа

Вот один способ сделать это:

$ for file in ifcfg*; do
    num=$(grep IPADDR $file|awk -F. '{print $4}')
    sed -e "s/10.1.1.[0-9]\+/10.2.2.$(($num-19))/" $file >tmp/$file
  done

Это берет содержание IP-адреса и сокращение это вниз так, чтобы это был 4-й октет, который хранится в переменной $num. Эта переменная затем добавляется с 19 во время sed команда. Я должен был развернуть Ваш оригинал sed немного путем добавления a [0-9]\+ удалить существующий 4-й октет так, чтобы мы могли просто заменить его $num+19.

1
27.01.2020, 22:01
  • 1
    Спасибо, но получил сообщение об ошибке "sed: выражение № 1-e, символ 45: незавершенная' команда" –  rookie 02.07.2013, 18:21
  • 2
    @rookie - можно ли совместно использовать то, на что строки похожи, которые содержат IP-адреса? Вы выполняете это под /etc/sysconfig/network-scripts/ifcfg*? –  slm♦ 02.07.2013, 18:23
  • 3
    , из которого строки похожи на IPADDR=10.1.1.x и да, вид, я хочу измениться в/etc/sysconfig/network-scripts/ifcfg*, но играю в скопированной папке до сих пор –  rookie 02.07.2013, 18:29
  • 4
    Большой, большое спасибо!!! В чем я нуждался при оставлении в покое в офисе... Большой солнечный свет Вам :-) –  rookie 02.07.2013, 18:51
  • 5
    @rookie - спасибо отметьте его как принятый ответ и upvote, если Вы думаете, что это было полезно и самый соответствующий ответ для Вашего вопроса, таким образом, другие знают, что Вы проблема были разрешены.И тебе того же! –  slm♦ 02.07.2013, 18:54

У Вас будет лучшая удача при выполнении этого с awk, а не sed.

awk -F. '{printf ("%d.%d.%d.%d\n",$1,$2,$3,$NF-19)}'

или согласно Вашему примеру,

awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}'

или

for file in ifcfg*
do
    awk -F. '/10.1.1/ {printf ("10.2.2.%d\n",$1,$2,$3,$NF-19)}' $file >tmp/$file
done

Сохранить другие строки и принятие этого x последний элемент на строке, который будет заменен, вот то, что Вы делаете

for file in ifcfg*
do
    awk -F. '/10.1.1/ {printf ("%s.%d.%d.%d\n",$1,2,2,$NF-19)}
             !/10.1.1/ {print $0}' $file > tmp/$file
done
2
27.01.2020, 22:01
  • 1
    Спасибо, но это дает мне набор файлов, которые являются всеми одинаковыми: строка со всего 10.2.2.0 и также я должен сохранить другие строки в исходном файле, они теперь перезаписываются с awk. (С моей командой sed выше, оставили старое содержание, только IP адрес был изменен) –  rookie 02.07.2013, 18:07
  • 2
    У Вас есть другое содержание на той же строке? Вам, вероятно, придется настроить оператор печати для сохранения того содержания. –  unxnut 02.07.2013, 18:16
  • 3
    другое содержание находится на других строках и строке, которую я хочу изменить, является действительно IPADDR=10.1.1.x –  rookie 02.07.2013, 18:25
  • 4
    , я просто изменил ответ выше для заботы об этом. –  unxnut 02.07.2013, 18:49
  • 5
    OK, спасибо, это работает также. Этот форум является отличным способом получить справку!Спасибо! пользователи –  rookie 02.07.2013, 19:02

Я использовал бы жемчуг для этого:

$ grep '10\.' file[123]
file1:10.1.1.29
file2:10.1.1.30
file3:10.1.1.31

$ perl -i -pe 's/10\.1\.1\.(\d+)/ "10.2.2." . ($1 - 19) /ge' file[123]

$ grep '10\.' file[123]
file1:10.2.2.10
file2:10.2.2.11
file3:10.2.2.12
0
27.01.2020, 22:01
awk 'BEGIN{FS=OFS="."} {$NF -= 19; print $0 > ("tmp/" FILENAME)}' ifcfg*
.
1
27.01.2020, 22:01

Теги

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