Разбить большую строку на меньшие строки и вставить специальный символ в начале новой строки - PullRequest
0 голосов
/ 04 июня 2019

У меня есть файл, содержащий большие строки.Строки должны быть разделены на отдельные строки после двух символов, и новая строка должна быть // добавлена ​​в начале.

Что у меня есть:

MEANDER_XY
MEANDER_WS

Что требуется:

ME
//AN
//DE
//R_X
//Y
ME
//AN
//DE
//R_W
//S

Я использовал sed -e 's/.\{2\}/&\n/g'.Строка разделяется, но мне также нужно добавить //, как показано.

Ответы [ 3 ]

1 голос
/ 04 июня 2019

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

sed 's/[A-Z]_\?[A-Z]/&\n\/\//g' file

Совпадение в верхнем регистре от A до Z, за которым следует необязательное подчеркивание, за которым следует еще один верхний регистр от A до Z, и замените его собой, а затемперевод строки, за которым следуют две косые черты, глобально.

0 голосов
/ 04 июня 2019

Используя GNU awk, вы можете определять поля по их шаблону, используя FPAT (см. здесь ).Вы заявляете:

Строки должны быть разделены на отдельные строки после двух символов , и новая строка должна // добавляться в начале.

Ваш вывод, однако, предполагает два буквенных символа .Шаблон, который вам нужен:

FPAT=""[^[:alpha:]]*[[:alpha:]][^[:alpha:]]*[[:alpha:]]?"

Он ищет не более одного или двух буквенных символов, которые могут предшествовать или чередоваться с неалфавитными символами.(не закончено):

 MEANDER_XY -> ME\n//AN\n//DE\n//R_X\n//Y
 MEANDERS_XY -> ME\n//AN\n//DE\n//RS\n//_XY

Итак, следующий awk поможет:

awk 'BEGIN{FPAT=""[^[:alpha:]]*[[:alpha:]][^[:alpha:]]*[[:alpha:]]?"; OFS="\n//"}{$1=$1}1'

Используя POSIX awk, вы можете сделать более расширенную версию, которая всегда будет работать:

awk 'BEGIN{regex=""[^[:alpha:]]*[[:alpha:]][^[:alpha:]]*[[:alpha:]]"; OFS="\n//"}
     { s=$0
       while(match(s,regex)) {
          printf substr(s,RSTART,RLENGTH) (length(s)==RLENGTH ? "": OFS)
          s=substr(s,RLENGTH+1)
       }
       print s
     }'
0 голосов
/ 04 июня 2019

Не могли бы вы попробовать следующее, протестировано с вашими примерами.

awk '
{
  count=""
  while($0){
    if(match($0,/[a-zA-Z][^a-zA-Z]*[a-zA-Z]/)){
       value=substr($0,RSTART,RLENGTH)
       if(++count>1){
          print "//"value
       }
       else{
          print value
       }
       $0=substr($0,RSTART+RLENGTH)
    }
    else{
       if(length($0)){
          print "//" $0
          next
       }
    }
  }
}'   Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...