На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
nerve
Сообщения: 280
ОС: 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
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
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
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 03.03.2014 13:34
sed -n 's/|\(..\)||||/|>added text<\1>added text<||||/p'
Upd.
SLEDopit опередил.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
nerve
Сообщения: 280
ОС: OpenBSD
Сообщение
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||
а вот так выводит весь файл вместо нужных строк, как в случае с седом
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
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
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 03.03.2014 14:24
nerve писал(а): ↑ 03.03.2014 14:17
что означают экранированые скобки
Захват строки.
nerve писал(а): ↑ 03.03.2014 14:17
и экранированная единичка в шаблоне замены?
Подстановка первой (и в данном случае единственной) захваченной строки.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
nerve
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 03.03.2014 15:03
Да.
См. info sed regular expressions
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
nerve
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
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
Сообщения: 280
ОС: OpenBSD
Сообщение
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
Контактная информация:
Сообщение
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/|..|
тут лучше
а то под точки что угодно подходит, палки тоже.
nerve
Сообщения: 280
ОС: OpenBSD
Сообщение
nerve » 05.03.2014 19:56
Реально на этом форуме самые лучше админы и пользователи!
Спасибо Следопыту, Биздельнику, Деврендому и Батти за ответы и помощь