Как заменить строку в тексте с помощью RegEX?

вы можете попробовать команду:

bt-device --remove kimilky
1
13.02.2020, 02:02
3 ответа

Это команда sed, которую я бы использовал:

sed -e '3,$s/ -\*  =[=[:space:]]*\// -*  V02.11.2020.1\t11\/Feb\/2020\tAuthor2\tMinor\tChange include 1ms\n\0/' file

Возможно, вам придется повозиться с вкладками, чтобы они соответствовали вашему макету.

0
28.04.2021, 23:23

Думаю, у меня есть то, что вы хотите добавить к вашему сценарию. Я создал файл с именем testfile.txt со следующим текстом в нем:

-* some lines
-* some more lines
-* ======= ====== ======= ======= =======/
-* data data data
-* more data more data more data
-* ====== ====== ======= ======= ======/

Я сделал это только для того, чтобы он выглядел примерно так, как ваш файл, и вы можете настроить его под свои нужды. Следующие команды (, которые могут войти в сценарий оболочки ), будут вставлять «вставка новых данных вставка новых данных вставка новых данных» перед вторым разделителем, который находится в конце раздела данных.Я понимаю, что это то, что вы пытаетесь сделать.

lines=`grep -nEe "=+" testfile.txt | sed -e s/":.*"//`
lines=`echo $lines`
read line1 line2 <<< $lines
sed -i ${line2}i"-* inserting new data inserting new data inserting new data" testfile.txt

Окончательный файл для меня теперь

-* some lines
-* some more lines
-* ======= ====== ======= ======= =======/
-* data data data
-* more data more data more data
-* inserting new data inserting new data inserting new data
-* ====== ====== ======= ======= ======/

Это эффективно завершает то, что я понимаю в вашей проблеме. Пожалуйста, уточните, есть ли какие-либо другие углы, которые необходимо решить, чтобы это было завершено.

Обратите внимание, что мое регулярное выражение очень простое, оно просто принудительно ищет совпадение со строкой со всеми знаками равенства и предполагает, что файл "хорошо себя ведет". Вам может понадобиться более конкретное регулярное выражение, если содержимое файла может различаться (, т.е. если строка без разделителя может содержать знаки равенства ). Я понимаю, что ваш вопрос подразумевает, что вы можете написать регулярное выражение самостоятельно и нуждаетесь в помощи для получения второго совпадения. Также обратите внимание, что я предполагал, что вам нужно только второе совпадение, и их всегда будет ровно 2.

Первая команда сохраняет все номера строк, соответствующие шаблону, в переменной lines. Вторая команда убирает из переменнойlines(какой-то неверный символ )не знаю, чтобы она была разделена пробелом. Третья команда сохраняет каждый совпадающий номер строки в своей собственной переменной (, здесь я предполагаю ровно 2 совпадения ). Четвертый вставляет нужные новые данные перед вторым совпадением.

0
28.04.2021, 23:23

Я думаю, что подход Poisson Aerohead может быть лучшим.
Я бы просто убрал некоторую сложность.

line=`grep -n '^ -\*  =*' testfile.txt | tail -1 |sed -e s/:.*//`
sed -i ${line}i'\ -* inserting new data ' testfile.txt

Имейте в виду, что при этом данные будут вставлены перед последней строкой, начинающейся с '-*==', хотя если имеется только одна строка (, то это также последняя )подобная этой.
Если строки нет, она будет вставлена ​​перед каждой строкой!!

0
28.04.2021, 23:23

Теги

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