$ tr '}' '\n' <file | sed -E 's/^ ?\{//'
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g
Este primero reemplaza cada }
con una nueva línea usando tr
. Esto le da al comando sed
líneas individuales para trabajar, donde cada línea comenzará con un posible espacio y un {
. Estos caracteres se eliminan del comienzo de la línea con el comando sed
.
Lo mismo con solosed
:
sed -E -e 's/ ?\{//g' -e 'y/}/\n/'
El comando y
funciona como tr
en este ejemplo.
Usando GNU awk
o mawk
, pero no BSDawk
:
$ awk -v RS='[{}]' '/[^[:blank:]]/' file
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g
Esto interpreta los datos como registros separados por {
o }
, y luego imprime cada registro que contiene algo más que tabulaciones o espacios.
Uso de Perl:
$ perl -ne 'map { print "$_\n" } /{(.*?)}/g' file
port1 dev1 M1 s
port1 dev1 M1 s
port3 dev2 M1 g
port1 dev1 M1 d
port1 dev1 M3 g
Esto aplica un comando print
a cada elemento devuelto al hacer coincidir la expresión regular dada con la entrada. El comando print
también agrega una nueva línea a cada elemento para ubicarlos en líneas individuales.
По рекомендации @Phillipos:
sed 'h;s/.*,//;s/./,"&"/g;x;G;s/,.*\n/"/;s/^/"/' inp.csv
Пояснение:
Разделите пространство паттернов на две части и работайте с ними по отдельности, а затем соедините их вместе.
perl -lpe '$_ = q["]. join(q[","], unpack sprintf "A%dx(A)*", index $_, ","). q["]' inp.csv
Краткое пояснение:
° Construct the unpacking format for the input line by finding the location position of the comma, skip the comma from unpack, remaining are unpacked a char each. Then joined with the string ",", finally all enclosed in double quotes.
IFS=, ; while read label string; do echo "\"$label\",$(echo $string| sed -e 's/\(.\)/\"\1\",/g' -e 's/,$//') "; done < inputfile