Bash заменить строку, если существует другая строка - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь написать bash-скрипт, который будет читать весь файл построчно, искать конкретную строку, если такая строка существует, - извлечь строку из нее в переменную, найти другую конкретную строку и заменить ее этой переменной. Он должен быть в цикле while, поскольку в этой паре строк может быть несколько вхождений, поэтому я не хочу заменять все строки на 1 переменную, так как каждый случай будет отличаться, вот пример:

line1
mynumber: 666
line3
line4
show (value)
line5
line6
mynumber: 111
line7
line8
line9
line10
show (value)

поэтому я хочу, чтобы после замены это выглядело так:

line1
mynumber: 666
line3
line4
show (666,value)
line5
line6
mynumber: 111
line7
line8
line9
line10
show (111,value)

вот мой сломанный код, который не работает, потому что переменные выбираются, но добавляются 1 за другим (массив), и я думаю, что это нарушает sed,

 for i in $(seq $count);
 do while IFS= read -r line;
 do var1="$(grep -o -E '.{0,0}mynumber: .{0,3}' File.cs | egrep -o ".{3}$")" ; done < "$input";
sed -i "s/(value)/(${var1},value)/g
" File.cs; ; done

Проблемы, которые я получаю: Var = 666 111, и я хотел бы быть только 1 значением за замену, и я получаю ошибку от sed: sed -e выражение # 1: команда s не определена

Ответы [ 3 ]

3 голосов
/ 03 октября 2019

AWK может сделать это в одиночку.

$ awk '$1=="mynumber:"{c=$2} $1=="show"{sub(/\(/,"&"c",")}1' file
line1
mynumber: 666
line3
line4
show (666,value)
line5
line6
mynumber: 111
line7
line8
line9
line10
show (111,value)
0 голосов
/ 03 октября 2019

Решение Perl:

perl -pe '$n=$1 if /mynumber: (\d+)/; s/show \(/show($n,/' file

Используйте -p для циклического перебора входного файла построчно. (например, sed или awk)

Установите $n для первой группы совпадений в /mynumber: (\d+)/, если есть совпадение.

Затем используйте замену s/// для вставки "$n," после"show("

0 голосов
/ 03 октября 2019

Это может сработать для вас (GNU Sed & Parallels):

parallel -q sed -Ei '/{}/{h;:a;n;/^show/!ba;G;s/\((.*)\n.* (.*)/(\2,\1/}' file ::: 666 111

Используйте параллель для циклического перебора чисел 666 и 111 и Sed для вставки затем чисел в следующие showстрок.

NB. Заменяемые числа могут быть сохранены в файле, и то же решение используется со следующим исправленным решением.

parallel -q sed -Ei '/{}/{h;:a;n;/^show/!ba;G;s/\((.*)\n.* (.*)/(\2,\1/}' file :::: fileContainingNumbers
...