Строка Заменить |Shell / Bash файл - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь заменить строку, используя sed из файла sh.

Проблема: после «соединения» у него пустая строка, а его строка «-url» появляется в следующей строке, кроме того, требуетсятакже замените номер порта и строку пароля.С помощью sed я не могу удалить пустую строку после подключения.

Исходная строка:

connection

-url>jdbc:oracle:thin:@10.10.10.11\:1551/password1 /connection-url

Заменить на :

connection-url>jdbc:oracle:thin:@10.10.10.90\:1555/password2 /connection-url

Я попробовал следующие команды, которые не работали:

sed -i 's/connection[\t ]+/,/g' sed-script.sh

sed 's/\connection*-\connection*/-/g' sed-script.sh 

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

С sed -

sed -E '
  /connection$/,/^-url/ {
    /connection$/ { h; d; }
    /^$/            d
    /^-url/       { H; s/.*//; x; s/\n//g; }
  }
' old > new

Предполагается, что без пробелов и что connection на отдельной строке должно сопровождаться строкой, начинающейся с -url ...

0 голосов
/ 19 декабря 2018

Протестировано с GNU awk.

awk -v RS="\n+{n}" '{$1=$1} 1'  Input_file
connection -url>jdbc:oracle:thin:@10.10.10.11\:1551/password1 /connection-url

Не могли бы вы попробовать один раз.

awk '/^connection/{val=$0;next} NF && /^-url/{print val $0;val=""}' Input_file

Вывод будет следующим.

connection-url>jdbc:oracle:thin:@10.10.10.11\:1551/password1 /connection-url
0 голосов
/ 19 декабря 2018

Вы можете удалить пустую строку после «соединения», используя tr.

echo <input string> | tr -d "\n"

Где мы можем видеть, что нам нужен символ \n, выполнив строку через od -c:

0000000 c o n n e c t i o n \n \n - u r l 0000020 > j d b c : o r a c l e : t h i 0000040 n : @ 1 0 . 1 0 . 1 0 . 1 1 \ : 0000060 1 5 5 1 / p a s s w o r d 1 / 0000100 c o n n e c t i o n - u r l \n

0 голосов
/ 19 декабря 2018

sed по умолчанию обрабатывает строку;если вы хотите проверить, следует ли за другой строкой пустая строка, вы должны написать sed сценарий для ее реализации.

Я бы вместо этого использовал Awk или Perl для этой конкретной задачи.

perl -p0777 -i -e 's/connection\n\n-url/connection-url/' file

awk '/^connection/ { c=1; next }
    c && /^$/ { c++; next }
    c && /^-url/ { $1="connection" $1; c=0 }
    c { print "connection-";
        while(--c) print "" }
    1' file >file.new

Perl, как и sed, имеет опцию -i для замены файла на месте.GNU Awk имеет расширение, чтобы сделать то же самое (ищите -i inplace), но оно не переносимо для меньших Awks.

Опция Perl -0777 заставляет весь файл ворчать впамять как одна «строка», перевод строки (\n) и все.Если файл очень большой, это, очевидно, будет проблематично.

Скрипт Awk заботится о том, чтобы вернуть пропущенные строки, если он все-таки оказался ложным.

...