Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: SED добавление и удаление одной строки после найденой  (Прочитано 3807 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Domitory

  • Автор темы
  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
Всем доброго времени суток!
Собственно сам вопрос в теме.
Как правильно добавлять и удалять строки посреди файла после определенной строчки с помощью потокового редактора SED?

Как добавлять и удалять строки после каждого совпадения по всему файлу это понятно, этой инфы по интернету полно.

Не могу понять как добавить строку после первого найденного совпадения, после второго, третьего и т.д.
И аналогично удалять строки.

Вот вроде докумекал до команды которая делает вставку после первого нахождения совпадения
sed -i '0,/LINUX/ i /111111111/' linux.txt

Ну а как сделать вставку после второго не понял. Если ноль заменить то получается какая то дичь.

С удалением после первого совпадения вот такие команды

sed -i '0,/LINUX/{/LINUX/d;}' linux.txt     -
sed -i '2,/LINUX/{/LINUX/d;}' linux.txt

"2" я так понимаю тут задает использование двух совпадения после первого, так как удаляются первые две строки похожих
« Последнее редактирование: 28 Ноября 2021, 04:52:47 от Domitory »

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 618
  • xUbuntu 22.04
    • Просмотр профиля
Приветствую!

Может попробовать «наметить» все строки с искомыми совпадениями чем-то уникальным с номером, например 001╳∠÷ ┃ 002╳∠÷  и т.д. добавив это в начало строки. Затем удалить нужную строку 032╳∠÷, потом очистить, удалив добавленные метки  :idiot2:

В общем это не очень красиво, но может сработать. Вариант так себе, но ничего другого умного в голову не пришло😞…

2021 Nov 28; 07:07 AM
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3026
    • Просмотр профиля
Если другое, так это можно и без sed, скриптом на bash.
Пётр.

Оффлайн Domitory

  • Автор темы
  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
Что за скрипт тут можно придумать?

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 618
  • xUbuntu 22.04
    • Просмотр профиля
Приветствую ещё раз Domitory!

Если я правильно понял задачу, что не факт, тут две причины русский язык мне совсем не родной😞, плюс соображаю я в этом во всём так себе😞…

Во вложении тренировочный файл.

(Нажмите, чтобы показать/скрыть)

Решение примитивное, но оно работает. Если я неправильно понял задачу, попробуйте на базе моего тренировочного файла уточнить задачу. При покажите свой файл, если это, естественно, не нарушает конфиденциальности.

2021 Nov 28; 02:23 PM

Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Domitory

  • Автор темы
  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
„Привет, это снова я😇!”

Спасибо за подсказку и команду такую сложную, только все равно разобраться не могу.
Ваш скрип работает если в тексте есть именно  zFlAsH12, специально понатыкал это по своему файлу.

И еще если  значения "grep '^13'" и "sed "s:13\" менять на другие значения не меньше "3" то все нормально, если задаешь "1" или "2 то

#/bin/bash
QQ=$(cat linux.txt | nl -ba | grep -i   zFlAsH12 | nl | sed "s:^[\ ]*::" | grep '^2' | \
sed "s:2\t[ ]*::;s:\t.*::");QW=1;QE=$(($QQ+$QW)); sed -i "${QE}i HelloWorldIt_S_MeAgain" linux.txt


то выдаёт ошибки

./sed.sh: строка 3: 26
20
21
262
23
24
25
26
27+1: синтаксическая ошибка в выражении (неверный маркер «20
21
262
23
24
25
26
27+1»)
[dklec@prt-ltest 1]$


А вот попробовал подставить свое слово "linux" в скрипт

#/bin/bash
QQ=$(cat linux.txt | nl -ba | grep -i  linux | nl | sed "s:^[\ ]*::" | grep '^13' | \
sed "s:13\t[ ]*::;s:\t.*::");QW=1;QE=$(($QQ+$QW)); sed -i "${QE}i HelloWorldIt_S_MeAgain" linux.txt


и выдает ошибки


./sed.sh: строка 3: 32
130
131
132
133
134
135
136
137
138
139+1: синтаксическая ошибка в выражении (неверный маркер «130
131
132
133
134
135
136
137
138
139+1»)




Пользователь добавил сообщение 29 Ноября 2021, 10:11:03:
Вот по слову "zFlAsH12" и по номеру строки от 3 до 100 работает нормально ваш скрипт, замечательно работает.

А как сделать чтобы отрабатывал с другими словами и сразу после первого совпадения?




Пользователь добавил сообщение 29 Ноября 2021, 10:37:05:
Сейчас еще раз поигрался с вашим скриптом.
интересная штука выходит
Если я например подставляю слово "linux" то выдает ошибки и скрипт не отрабатывает, если подставляю ваше слово " zFlAsH12" то скрипт работает только если нужно подставить после 3 строки и больше значения 3.

Подставил слово  "ilinux" и скрипт начал отрабатывать все отлично, и после первого совпадения вставлять новую строчку.
подставлял слова "UNIX" и "LINUX" опять ошибки. Подставил "xUNIX" и "iLINUX" и опять все отлично.

Каким то образом на отработку команд влияет содержимое искомого текста.
« Последнее редактирование: 29 Ноября 2021, 10:48:54 от Domitory »

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 618
  • xUbuntu 22.04
    • Просмотр профиля
Приветствую, Domitory!

О, с задачей стало яснее😇, жаль не подключаются знающие люди😞…

Сейчас внуков по школам развезу и приступлю ко второй редакции😇, надеюсь она будет лучше…

У нас с Вами, наверное, разница во времени:

2021 Nov 29; 07:03 AM

Пользователь добавил сообщение 30 Ноября 2021, 04:28:17:
Продолжаю, снег у нас случился, бывает таки такое зимой😇!

В строку не вмещается, скриптом пришлось изобразить:

(Нажмите, чтобы показать/скрыть)

В общем пробуйте, до Нового Года времени много😇, опять сожалею, что к вопросу не подключились профессионалы😞…

2021-11-29 20:28:10



« Последнее редактирование: 30 Ноября 2021, 04:40:48 от qpdb »
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Domitory

  • Автор темы
  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
AE='====Это строка которую нужно добавить====' # Строка для добавления…

Спасибо большое!
Я так понимаю это скрипт работает чисто для добавления строчки после нахождения совпадения?

Что то не пойму как исправить его чтобы мог вставлять и перед найденной строчкой.

Вот эта команда скрипта
sed -i "${QI}i $AE" $AW
вроде как должна же делать вставку перед совпадением? или я что то путаю

во всяком случае
sed -i "${QI}a $AE" $AW
делает тоже самое.

И как этот скрипт приспособить чтобы просто удалял найденную строчку.

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 618
  • xUbuntu 22.04
    • Просмотр профиля
Приветствую, Domitory, как раз нужно забирать внуков из школы у нас 2021-11-30 13:57 😇!

Через несколько часов я нормально отвечу и напишу какая команда и что делает, а также, я думаю мы решим дополнительные задачи…

2021 Nov 30; 02:00 PM
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Domitory

  • Автор темы
  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
Вот к такому виду привел файл чтобы попробовать удалить строчку
#!/bin/bash
AQ='LINUX' # Слово или фраза для поиска допустимы пробелы и многие спецсимволы
QR=1 # Позиция  совпадения
AW='linux.txt' # Путь к файлу
PO=$(cat $AW | nl -ba | grep -a  "$AQ" | nl | sed "s:^[\ ]*::" | grep  -o "^$QR")
QQ=$(cat $AW | nl -ba | grep -a  "$AQ" | nl | sed "s:^[\ ]*::" | grep  "^$QR" | \
sed "s:$PO::;s:^[\ ]*::;s:^[ |\t]*::;s:\ .*::;s:\t.*::")
QW=1;QI=$(($QQ+$QW))
sed -i /$QI/d $AW
exit

Удалило первое совпадение но наверное только по тому что это была самая первая строчка в файле. И больше не удаляет

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 618
  • xUbuntu 22.04
    • Просмотр профиля
Продолжаю, Domitory

(Нажмите, чтобы показать/скрыть)

Команда просто для просмотра ваших строк и совпадений будет выглядеть:

cat /Путь_К_Файлу | nl -ba | grep -e 'Для_Поиска' | nl

(Нажмите, чтобы показать/скрыть)

В общем пробуйте, до завтра если, что! Т.е. встретимся зимой😇!

2021-11-30 17:01:50
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Domitory

  • Автор темы
  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
sed -i ${QI}d $AW # Итоговая команда для удаления строки в указанной позиции…
что то не получается удалить строку. Всё остается как было без изменений

Пользователь добавил сообщение 01 Декабря 2021, 21:41:32:
А нет, удаляет.
Добавил одинаковые строки и пронумеровал их.И вот что получчается

Если указать QR=1 то такое сообщение выдает вместо выполнения
sed: -e выражение #1, символ 3: незавершенная команда `s'


Если указать QR=2 то удаляется строка №3

Если указать QR=3 то удаляется строка №4

Пользователь добавил сообщение 01 Декабря 2021, 22:02:31:
Вроде разобрался!


если задать QW=0 то тогда удаляет ту позицию которая задана в QR

#!/bin/bash
AQ='LINUX' # Слово или фраза для поиска допустимы пробелы и многие спецсимволы
QR=7 # Позиция  совпадения
AE='СуперВажно ====  Добавить! ====' # Строка для добавления
AW='linux.txt' # Путь к файлу
PO=$(cat $AW | nl -ba | grep -e  "$AQ" | nl | sed "s:^[\ ]*::" | grep  -o "^$QR") # Номер совпадения
QQ=$(cat $AW | nl -ba | grep -e  "$AQ" | nl | sed "s:^[\ ]*::" | grep  "^$QR" | \
sed "s:$PO::;s:^[\ ]*::;s:^[ |\t]*::;s:\ .*::;s:\t.*::") # Номер строки файла (←↑две строчки)
#QW=0 # Переменная  положение строки для вставки „0,-1,-2…” → ВЫШЕ, „1,2,3…” → НИЖЕ…
QW=0 # Для удаления строки ВЫШЕ → „-1,-2,-3…” ; Для удаления строки НИЖЕ →  „1,2,3…”
QI=$(($QQ+$QW)) # Итоговая позиция  для ввода или удаления строки
sed -i ${QI}d $AW # Итоговая команда для удаления строки в указанной позиции
#sed -i "${QI}i $AE" $AW # Итоговая команда, именно добавление строки в указанное место
exit
« Последнее редактирование: 01 Декабря 2021, 22:02:42 от Domitory »

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 618
  • xUbuntu 22.04
    • Просмотр профиля
Приветствую!
У меня всё работает, проверил ещё раз…

Может дело в вашем файле, хотя не должно вроде  :idiot2:

Мой тренировочный файл в архиве.

Моя последовательность действий:

(Нажмите, чтобы показать/скрыть)

Применяемый к этому действию скрипт (очищен от всего лишнего т.е. убраны строки с комментариями)

(Нажмите, чтобы показать/скрыть)

Может быть ошибка синтаксиса, особенно если не пользуетесь терминальными редакторами, простейший nano. Обычный текстовой редактор не очень годится для «скриптописания»😞… Даже такого примитивного как в данном случае.

Для рядового пользователя, которым, например, и я тоже являюсь nano достаточно. Для программистов, конечно, он очень прост и недостаточно функционала.

2021-12-01 14:08:56
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

Оффлайн Domitory

  • Автор темы
  • Активист
  • *
  • Сообщений: 565
    • Просмотр профиля
простейший nano
Я пользуюсь vim, nsno так и не осилил. Кстати вопрос по поводу текстового редактора. Как вы вставляете троеточие одним символом? что это за символ вообще такой?

Вроде разобрался с вашим скриптом. Спасибо большое еще раз!

Теперь бы понять как он устроен :)

Самая непонятая это вот эти строки

PO=$(cat $AW | nl -ba | grep -e  "$AQ" | nl | sed "s:^[\ ]*::" | grep  -o "^$QR") # Номер совпадения
QQ=$(cat $AW | nl -ba | grep -e  "$AQ" | nl | sed "s:^[\ ]*::" | grep  "^$QR" | \
sed "s:$PO::;s:^[\ ]*::;s:^[ |\t]*::;s:\ .*::;s:\t.*::") # Номер строки файла (←↑две строчки)

Что тут происходит? Строка "PO" хоть мутно но понятна вроде, а вот в QQ я совсем ку-ку
« Последнее редактирование: 02 Декабря 2021, 10:38:07 от Domitory »

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 618
  • xUbuntu 22.04
    • Просмотр профиля
Приветствую!

Как вы вставляете троеточие одним символом? что это за символ вообще такой?

Да это всё практически развлечения, что ещё делать на пенсии в эпоху мирового медицинского коллапса😇!


Это относится к теме «типографские символы», «третий ряд клавиатуры». Т.е. эти символы вводятся при зажатой клавише модификаторе. У меня это клавиша, которая вызывает контекстное меню, можно назначить другую.

На картинке программа, которая отображает клавиатуру, она слегка обманывает, не все символы отражены правильно.

Посмотрите у себя что вообще есть в системе про „typo”?
locate -cie "*typo*"
locate -ie "*typo*"
locate -cie "*typo"

Может быть от рождения здесь
cat /usr/share/X11/xkb/symbols/typo
Этот файл легко правится и добавляются или заменяются символы. Откройте новую тему может кто поделится (я точно😈) своими файлами „typo” да их и в интернете много вариантов. Просто здесь мы выходим за рамки заявленной темы😞…


Я пользуюсь vim
А, ну тогда nano практически не нужен, хотя для многих простых задач редактора vim откровенно много😇!

Ну и по делу:
echo '     4    10 # The command can contain these environment variables:' | grep -o 10
10
Т.е. „-o” показывает не всю строку, а именно только то, что ищем «10», переменные „$QQ;$AQ“ затрудняют быстрое понимание.

Вы попробуйте заменить переменные на конкретные значения и будет всё довольно ясно.
Отдельно попробуйте команду nl, можете почитать man (туда любят некоторые высокомерно посылать😞), он там короткий.
А вот касательно grep и sed там читать и читать😞…

У меня
sed "s:$PO::;s:^[\ ]*::;s:^[ |\t]*::;s:\ .*::;s:\t.*::")
реализовано  не очень😕, наверное можно покороче, разделители „:” можно другие, обычно „/”, но мне удобнее двоеточие.

Можно вообще частично с помощью tr убирать пробелы и „\t” (табуляция)… Короче жизни не хватит это всё досконально выучить.

Если плохо объяснил, скажите, я попробую более подробно.

2021-12-02 08:18:03
Рекомендую ознакомиться с современной трактовкой темы „collective responsibility and the state”, а также темами сопряжёнными с этой… В современных реалиях это может оказаться полезным…

 

Страница сгенерирована за 0.028 секунд. Запросов: 22.