Поиск строки по маске и добавление текста в нужное место в строке

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Поиск строки по маске и добавление текста в нужное место в строке

Сообщение nerve » 03.03.2014 13:15

вот такой маской я нахожу нужные мне строки в файле:

Код: Выделить всё

sed -n '/|..||||/p' result.txt
|10||||Top QA System Documents||
|20||||General QA documents||
|30||||Registrations||
|40||||Instructions||
|50||||Processes||

теперь в эти строки мне нужно вставить текст сюда:

Код: Выделить всё

|>added text<10>added text<||||Top QA System Documents||

чтоб получилось что-то вроде:

Код: Выделить всё

|mytext_110mytext_2||||Top QA System Documents||

думал воспользоваться awk чтоб вставлять как-то так:

Код: Выделить всё

awk 'BEGIN { FS = "|" } {$2="mytext_1"$2"mytext_2"}  {print $0} result.txt > new.txt

но авк применит вставку текста для всей колонки, а вот как связать найденные седом по маске строки с авк не пойму.
может есть проще способ?
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение SLEDopit » 03.03.2014 13:33

nerve писал(а):
03.03.2014 13:15
может есть проще способ?
целых 2:
1. не только вставлять awk'ом, но и искать им же

Код: Выделить всё

awk -F'|' 'BEGIN { OFS = "|" } /\|..\|\|\|/{$2="mytext_1"$2"mytext_2"};{print $0}'

2. не только искать sed'ом, но и вставлять им же

Код: Выделить всё

sed '/|..||||/s/^|\(..\)|/|my_text1\1my_text_2|/'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15823
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение Bizdelnick » 03.03.2014 13:34

sed -n 's/|\(..\)||||/|>added text<\1>added text<||||/p'

Upd. SLEDopit опередил.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение nerve » 03.03.2014 13:54

SLEDopit писал(а):
03.03.2014 13:33
1. не только вставлять awk'ом, но и искать им же

Код: Выделить всё

awk -F'|' 'BEGIN { OFS = "|" } /|..|||/{$2="mytext_1"$2"mytext_2"};{print $0}'

проверил: вставляет во все строки начиная с первой

Код: Выделить всё

$ awk -F'|' 'BEGIN { OFS = "|" } /|..|||/{$2="mytext_1"$2"mytext_2"};{print $0}' result.txt
|mytext_1 *Main* mytext_2| *Sub* | *Serial* | *Rev.* | *Description* | *Link*|


я вообще что-то не могу добиться от авк поиска нужной строки по маске.
то есть вот так ищет:

Код: Выделить всё

$ awk -F'|' '/Support/' result.txt
|50|05|||Support||

а вот так выводит весь файл вместо нужных строк, как в случае с седом

Код: Выделить всё

$ awk -F'|' '/|..||||/' result.txt
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение SLEDopit » 03.03.2014 14:02

Виноват, забыл pattern для awk'a адаптировать:

Код: Выделить всё

awk -F'|' 'BEGIN { OFS = "|" } ; /^\|..\|\|\|/{$2="mytext_1"$2"mytext_2"};{print $0}'

зы. в оригинале тоже исправил.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение nerve » 03.03.2014 14:17

Bizdelnick писал(а):
03.03.2014 13:34
sed -n 's/|\(..\)||||/|>added text<\1>added text<||||/p'

Upd. SLEDopit опередил.

спасибо! это кажется работает.
а что означают экранированые скобки с точками в шаблоне поиска?
sed -n 's/|\(..\)||||/
и экранированная единичка в шаблоне замены?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15823
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение Bizdelnick » 03.03.2014 14:24

nerve писал(а):
03.03.2014 14:17
что означают экранированые скобки

Захват строки.

nerve писал(а):
03.03.2014 14:17
и экранированная единичка в шаблоне замены?

Подстановка первой (и в данном случае единственной) захваченной строки.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение nerve » 03.03.2014 14:49

Bizdelnick писал(а):
03.03.2014 14:24
Захват строки.
Подстановка первой (и в данном случае единственной) захваченной строки.

то есть скобками в шаблоне поиска мы выделяем часть текста, которую потом подставляем в шаблоне замены (чтоб не потерять значение двух символов, которые мы нашли двумя точками)?
то есть можно выполнить несколько замен в найденной строке, например

Код: Выделить всё

sed -n 's/|\(..\)|||\(..\)|/|>added text<\1>added text<|||>added<\2>added<|/p'

этим мы говорим добавить дополнительно текст вокруг двух символов в другом месте строки.
а этот захват можно перемещать в шаблоне замены?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15823
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение Bizdelnick » 03.03.2014 15:03

Да.
См. info sed regular expressions
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение nerve » 05.03.2014 19:13

все равно не разобрался.

Код: Выделить всё

$ sudo sed -n '/|..||||/p' result.txt
|10||||Top QA System Documents||
|20||||General QA documents||
|30||||Registrations||
|40||||Instructions||
|50||||Processes||
$ sudo sed -n 's/||||\([A-Za-z ]*\)||/QWERTY\1/p' result.txt
|10QWERTYTop QA System Documents
|20QWERTYGeneral QA documents
|30QWERTYRegistrations
|40QWERTYInstructions
|50QWERTYProcesses

я хочу получить только QWERTY+захваченный текст, то есть избавиться от палок и цифр в начале.
почему там остается |10 а допустим остальных вертикальных палок нет.
по идее же должно получиться так
|10||||QWERTYTop QA System Documents||
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение SLEDopit » 05.03.2014 19:27

nerve писал(а):
05.03.2014 19:13
почему там остается |10 а допустим остальных вертикальных палок нет.
потому что они входят в паттерн, который вы заменяете ( /||||\([A-Za-z ]*\)||/ ). всё, что указано между // будет заменено. то, что указано в \(\) попадает в \1 и остаётся, т.к. в паттерне на который вы заменяете есть \1.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение nerve » 05.03.2014 19:43

Код: Выделить всё

$ sed -n 's/|..||||\([A-Za-z ]*\)||/QWER TY\1/p' result.txt
QWER TYTop QA System Documents
QWER TYGeneral QA documents
QWER TYRegistrations
QWER TYInstructions
QWER TYProcesses

вот так получилось:)
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение drBatty » 05.03.2014 19:46

nerve писал(а):
05.03.2014 19:13
я хочу получить только QWERTY+захваченный текст, то есть избавиться от палок и цифр в начале.

может так понятнее:

$

echo "ABCDEF" | sed -r 's/(DEF)/+++\1/' ABC+++DEF



nerve писал(а):
05.03.2014 19:43
sed -n 's/|..|

тут лучше

Код: Выделить всё

|[0-9][0-9]|

а то под точки что угодно подходит, палки тоже.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 267
ОС: OpenBSD

Re: Поиск строки по маске и добавление текста в нужное место в строке

Сообщение nerve » 05.03.2014 19:56

Реально на этом форуме самые лучше админы и пользователи!
Спасибо Следопыту, Биздельнику, Деврендому и Батти за ответы и помощь:)
Спасибо сказали: