LINUX.ORG.RU

Удаление части строки по шаблону

 , , ,


0

2

Строка из csv:

abnm;ghjkghjk;342;hjkh;4324;34234;432;"hjhjk\`;''""'{)($!*."";567;рол;78

Между первой и последней кавычкой (") может быть произвольный текст, включающий что угодно. Только поле 8 с текстом обрамлено этими кавычками.

Нужно:

1. Вывести значение девятого поля (bash + grep, можно sed, но лучше не надо)

или

2. Вообще вырезать поле с текстом, приведя строку к виду:

abnm;ghjkghjk;342;hjkh;4324;34234;432;567;рол;78

Спасибо.



Последнее исправление: rusya_rr (всего исправлений: 1)

500 руб, за форум девелопмент и банальные вопросы.

anonymous
()

ладно я добрый

awk -F';' '{print $(NF-2)}'

anonymous
()
Ответ на: комментарий от rusya_rr

Ты на точки с запятой в поле 8 перезаложился?

он нет, а я с конца поля считаю, если их всегда 11, как в твоем примере, то NF-2 как раз будет.

anonymous
()
Ответ на: комментарий от rusya_rr
$ echo '1;2;3;4;5;6;7;"8;8;8;";9;10;11' | grep -o '[^;]*;[^;]*;[^;]*$' | grep -o '[^;]*' | head -1
9

$ echo '1;2;3;4;5;6;7;"8;8;8;";9;10;11' | grep -o '[^;]*' | tail -3 | head -1
9
anonymous
()
Ответ на: комментарий от anonymous

И напоследок чистый bash

$ A='1;2;3;4;5;6;7;"8;8;8;";9;10;11'

$ B=${A%;*;*;*}

$ echo $B
1;2;3;4;5;6;7;"8;8;8;"

$ N=$[${#B}+1]

$ C=${A:$N}

$ echo $C
9;10;11

$ echo ${C%%;*}
9

anonymous
()
Ответ на: комментарий от anonymous

Всё

$ A='1;2;3;4;5;6;7;"8;8;8;";9;10;11'
$ B=${A%;*;*}
$ echo ${B##*;}
9

anonymous
()
Ответ на: комментарий от rusya_rr
$ cat example.txt 
bnm;ghjkghjk;342;hjkh;4324;34234;432;"hjhjk\`;|;""";'''""'{)($!*."";";567;рол;78
$ sed 's/;".*"//' example.txt
bnm;ghjkghjk;342;hjkh;4324;34234;432;567;рол;78

что я понял не так?

Deleted
()
Ответ на: комментарий от Deleted

Да, ты прав, а я не прав. Прошу прощения.

rusya_rr
() автор топика
Ответ на: комментарий от rusya_rr

Все же хотел бы узнать, можно ли, используя grep, удалить поле, основываясь лишь на том, что оно обрамлено кавычками? Не привязываясь к числу полей. Так же элегантно, как sed-ом?

rusya_rr
() автор топика
Ответ на: комментарий от rusya_rr

Нужно что-то вроде

grep -o
, но наоборот. Вывод остатка строки без шаблона. И что-то вроде
[^шаблон]
. Я не смог найти такого функционала. А операция с удалением подстроки:
str1=$(echo '1;2;3;4;5;6;7;"8;8;""""8;";9;10;11');str2=$(echo '1;2;3;4;5;6;7;"8;8;""""8;";9;10;11' | grep -Eo '\".*?\"');echo ${str1#$str2}

у меня почему-то не работает. Хотел натравить join:

rusya@homyakubuntu:~$ str1=$(echo '1;2;3;4;5;6;7;"8;8;""""8;";9;10;11');str2=$(echo '1;2;3;4;5;6;7;"8;8;""""8;";9;10;11' | grep -Eo '\".*?\"');join  <(echo $str1| grep -o .) <(echo $str2| grep -o .)
, но, видимо, не мой день.

rusya_rr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.