LINUX.ORG.RU

Подскажите самый простой способ распарсить файл содержащий данные строки

 , ,


0

1

Требуется распарсить файл и получить значения в первых фигурных скобках:

Содержимое файла
11:[1a] 11:[11]
22:[2a] 22:[22]
...

Результат:
1a
2a

PS: Не силен(но думаю разберусь) я при работе с awk/sed/cut поэтому спрашиваю здесь..

Немного подумал и придумал вот такой костыль)

cut -d":" -f2 | cut -d"[" -f2 | cut -d"]" -f1

Но буду рад более элегантному решению )


Всем спасибо) Скажите а как проще сделать если требуется получить т.е продублировать каждое значение и вставить между ними разделитель…)

1a:1a
1b:1b
...


Последнее исправление: Hex-Value (всего исправлений: 5)

В твоём примере первый cut ненужен
Если ко-во символов фиксированно, то
cut -с 5-6

bass ★★★★★
()
Последнее исправление: bass (всего исправлений: 2)

я не умею в элегантные, только в страшные

grep -Po '^[^\[]*\[\K[^\]]+' /tmp/file

или

grep -Po '^[^\[]*\[\K..' /tmp/file

если символа в скобках точно 2

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

2

Спасибо! Скажите а как проще сделать если требуется получить т.е продублировать каждое значение и вставить между ними разделитель…)

1a:1a
1b:1b
...
Hex-Value
() автор топика
Последнее исправление: Hex-Value (всего исправлений: 1)
Ответ на: 2 от Hex-Value

почитай про интерполяцию переменных в shell-скриптах

если кратко, то вот это "$a" (в скрипте с while) означает, что надо подставить значение переменной ‘a’ в то место в строке, где она указана. Надо подставить несколько раз — указывай $a в строке несколько раз, надо поставить между ними разделитель — поставь.

PS: писал бы ты задачу целиком сразу

xgatron
()
(tr [ ] | cut -d] -f2) < file.txt > row.txt
paste -d: row.txt row.txt > two_rows.txt
anonymous
()
Ответ на: комментарий от vodz
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION
5.0.16(1)-release
$ echo '11:[1a] 11:[11]' | while  read _ a _; do echo "$a"; done
11:[11]
$ IFS='[|]'
$ echo '11:[1a] 11:[11]' | while  read _ a _; do echo "$a"; done
1a
AnDoR ★★★★★
()
Ответ на: комментарий от anonymous

Входная строка не соответствует примеру ТС

Тогда строка не должна приниматься, должна пропускаться.

А в оригинале так:

получить значения в первых фигурных скобках

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

получить значения в первых фигурных скобках

фигурных

Тогда ни одно из решений не подходит ))

$ echo '11:[1a] 11:[11] ' | sed -r 's/^.+\[(.+)\]\s.+/\1/'
1a
anonymous
()
Ответ на: комментарий от anonymous
$ echo '11:[1a] 11:[11]        ' | sed -r 's/^.+\[(.+)\]\s\S+/\1/'
1a
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.