преобразовать соответствующий шаблон в строку

#awk #sed #grep

#авк #сэд #grep ( греп ) #awk #sed #grep

Вопрос:

Привет, у меня есть файл ограничений.

 [get_ports {rdata[*]}] [get_ports {wdata[*]}] [get_ports {axirdata[*]}] [get_ports {raddr[*]}] [get_ports {waddr[*]}] [get_ports en] [get_ports {xyz[*]}] [get_ports err]
  

Указанное выше ограничение находится в одной строке. Я хочу преобразовать его в столбец, подобный,

 [get_ports {rdata[*]}]

 [get_ports {wdata[*]}]

 [get_ports {axirdata[*]}]

 [get_ports {raddr[*]}]

 [get_ports {waddr[*]}]

 [get_ports en]

 [get_ports {xyz[*]}]

 [get_ports err]
  

Я хочу разделить каждый [get_port имя_порта] в один столбец с одной строкой

Как я могу сделать?

Спасибо

Комментарии:

1. Совсем не понятно. Не могли бы вы, пожалуйста, добавить больше деталей вместе с вашими усилиями в свой пост и сообщить нам тогда.

2. В файле ограничений он содержит [get_ports {rdata[ ]}] [get_ports {wdata[ ]}] [get_ports {axirdata[ ]}] [get_ports {raddr[ ]}] [get_ports {waddr[ ]}] [get_ports en] [get_ports {xyz[ ]}] [get_ports ошибка] в одной строке. Я хочу разделить его после каждого отдельного [get_ports name] на одну строку (в первый столбец)

3. Комментарии НЕ предназначены для публикации образцов, как и было запрошено ранее, пожалуйста, отредактируйте свой пост с помощью тегов кода.

Ответ №1:

Хотя это непонятно, похоже, вы хотите преобразовать строки в одну строку.

 paste -sd" "  Input_file
  

Вывод будет следующим.

 [get_ports {rdata[*]}] [get_ports {wdata[*]}] [get_ports {axirdata[*]}] [get_ports {raddr[*]}] [get_ports {waddr[*]}] [get_ports en] [get_ports {xyz[*]}] [get_ports err]
  


РЕДАКТИРОВАТЬ: Поскольку OP изменил образцы входных данных и ожидаемый результат, поэтому сейчас добавляю следующее решение.

 awk '{gsub(/] [/,"]"ORS"[")} 1' Input_file
OR
awk '{gsub(/] /, "]" ORS)} 1'  Input_file
  

Вывод будет следующим.

 [get_ports {rdata[*]}]
[get_ports {wdata[*]}]
[get_ports {axirdata[*]}]
[get_ports {raddr[*]}]
[get_ports {waddr[*]}]
[get_ports en]
[get_ports {xyz[*]}]
[get_ports err]
  

Комментарии:

1. @Вишал Патель, не могли бы вы попробовать это и дать мне знать потом?

2. Привет, Равиндер, все работает нормально. Спасибо. Можете ли вы это объяснить?

3. @oguzismail, конечно, спасибо, что сообщили мне, я был очень осторожен, поэтому взял 2 скобки, я добавил это решение и сейчас в свой пост, спасибо.

4. @VishalPatel , это похоже на то, что я просто заменяю все вхождения ] [ на ] ORS (новая строка) [ .

Ответ №2:

С помощью sed, который понимает n как значение a newline :

 $ sed 's/] *[/]n[/g' file
[get_ports {rdata[*]}]
[get_ports {wdata[*]}]
[get_ports {axirdata[*]}]
[get_ports {raddr[*]}]
[get_ports {waddr[*]}]
[get_ports en]
[get_ports {xyz[*]}]
[get_ports err]
  

С любым sed:

 sed 's/] *[/]
[/g' file
  

или любой awk:

 awk '{gsub(/] *[/,"]n[")}1' file
  

Ответ №3:

обеспечение отсутствия пробелов в строке, следующей за ‘get_ports’

 $ echo '[get_ports {rdata[*]}] [get_ports {wdata[*]}] [get_ports {axirdata[*]}] [get_ports {raddr[*]}] [get_ports {waddr[*]}] [get_ports en] [get_ports {xyz[*]}] [get_ports err]'| sed -E 's/([get_portss S )s/1n/g'
  

Ответ №4:

Это может сработать для вас (GNU sed):

 sed 's/ [get_ports/namp;/g' file
  

Это вставляет новую строку перед каждой строкой [get_ports и воспроизводит результаты так, как вы указали.

Чтобы правильно отформатировать столбец, используйте:

  sed 's/  ([get_ports)/n1/g' file
  

Это заменяет начальные пробелы новой строкой для каждой строки.