Рейтинг:0

Как добавить в конец строки до первого совпадения с шаблоном?

флаг in

У меня есть файл, содержащий некоторые случайные данные, например:

номер1 номер2 номер3
&КОНЕЦ

Я хочу добавить \ в конец строки, содержащей число 3, но я не могу сопоставить шаблон в этой строке, так как это число постоянно меняется. Итак, я пытаюсь сопоставить «&END» в sed, а затем добавить перед ним строку, но это не работает для меня, потому что создает новую строку, например

номер1 номер2 номер3

\

&КОНЕЦ

Мой желаемый результат

номер1 номер2 номер3 \
&КОНЕЦ

Кроме того, мне нужно внести это изменение только при первом появлении &END в файле. Есть ли способ сделать это с помощью sed или, может быть, awk?

РЕДАКТИРОВАТЬ: мой входной файл - test.restart, который выглядит так:

&КООРДИНАЦИЯ

1.4089452021105357E+01 1.3165670625576730E+01 1.2727066323166799E+01 \
 ...

 ...

1.3549295360587577E+01 1.2120902691780184E+01 1.2741652733169291E+01

&КОНЕЦ
...
...
&КООРДИНАЦИЯ

Н 3475843 73457834 7346587435
...
...
&КОНЕЦ

Мне нужно только внести изменения в текстовый блок до первого появления &END.

pLumo avatar
флаг in
Вам нужно добавить несколько реальных примеров, чтобы сделать ваш вопрос решаемым.
Pauling0304 avatar
флаг in
@pLumo Примеры чего из реального мира? Мои проверенные решения, которые не работают?
pLumo avatar
флаг in
Я имею в виду входные данные. ("*конец строки, содержащей число3, но я не могу сопоставить шаблон в этой строке, так как это число постоянно меняется.*"). Тогда каково ваше реальное «*число3*»? Или лучше: как узнать, что это именно та строка, которую вы хотите сопоставить?
pLumo avatar
флаг in
Еще один совет: используйте стиль `code` вместо стиля `quote`, чтобы сделать ваш вопрос более читабельным. Вы можете отредактировать свой вопрос.
pLumo avatar
флаг in
okkkk... ваш реальный пример сильно отличается от вашего упрощенного примера. \ не должен стоять в конце строки перед `&END`... Вместо этого он будет в следующей строке после `&COORD`?
Pauling0304 avatar
флаг in
@pLumo Нет, \ в конце строки после &COORD уже присутствует. Теперь я хочу поместить его в конец строки перед &END.
pLumo avatar
флаг in
ах хорошо, тогда мой ответ действителен.
Рейтинг:1
флаг in

Ты можешь использовать sed -z и включить \n по вашему шаблону:

-z, --null-данные
разделять строки символами NUL

sed -Ez 's/(\n+&END)/ \1/' файл

сед по умолчанию заменяет только первое вхождение в строке. Поскольку у вас есть только одна строка, если вы используете NUL-разделитель, все в порядке.

рассказывает сед использовать расширенное регулярное выражение (ERE) вместо базового регулярного выражения (BRE). Вы можете опустить флаг, но тогда вам нужно избежать фигурных скобок:

sed -z 's/\(\n+&END\)/ \1/' файл

Вывод:

&КООРДИНАЦИЯ

1.4089452021105357E+01 1.3165670625576730E+01 1.2727066323166799E+01 \
 ...

 ...

1.3549295360587577E+01 1.2120902691780184E+01 1.2741652733169291E+01 \

&КОНЕЦ
...
...
&КООРДИНАЦИЯ

Н 3475843 73457834 7346587435
...
...
&КОНЕЦ

Запись, -z отлично работает в Ubuntu, но доступно не во всех сед реализации и, следовательно, не является переносимым решением.

Pauling0304 avatar
флаг in
Можете ли вы сказать мне, для чего нужен флаг -E? И могу ли я использовать с ним -i, потому что я хочу отредактировать это в том же файле?
pLumo avatar
флаг in
Да, вы можете использовать `-i`, если вас устраивает вывод. Добавлено объяснение для `-E`.
Pauling0304 avatar
флаг in
Я получаю сообщение об ошибке: sed: -e выражение #1, char 19: неверная ссылка \1 на RHS команды `s'
pLumo avatar
флаг in
конечно, вы используете ту же команду?
Pauling0304 avatar
флаг in
Да я даже копипастил
pLumo avatar
флаг in
Оба работают нормально для меня. какая версия убунты? Я получаю эту ошибку при использовании первой версии без `-E`, что ожидаемо
Pauling0304 avatar
флаг in
Убунту 20.04.3 ЛТС
pLumo avatar
флаг in
Та же версия здесь. Должно работать нормально, больше не могу сказать, извините.
Pauling0304 avatar
флаг in
Я попробовал другой вариант без флага -E, и это не дает никаких ошибок, но и не выполняет работу.
pLumo avatar
флаг in
Хорошая идея @bac0n.

Ответить или комментировать

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