将大行拆分为小行,并在换行符开头插入特殊字符

时间:2019-06-04 10:46:38

标签: linux shell awk sed

我有一个包含大行的文件。这些行应在两个字符之后分成单独的行,并且新行应在开头添加//。

我有什么:

MEANDER_XY
MEANDER_WS

需要什么:

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

我用过sed -e 's/.\{2\}/&\n/g'。该行被分割了,但我还需要添加//,如图所示。

3 个答案:

答案 0 :(得分:1)

这可能对您有用(GNU sed):

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

在全局范围内匹配一个大写A到Z,然后是一个可选的下划线,再匹配另一个大写A到Z,并由其自身替换,然后换行,然后是两个反斜杠。

答案 1 :(得分:0)

请尝试按照给定的示例进行测试。

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

答案 2 :(得分:0)

使用GNU awk,您可以使用FPAT按照字段的模式定义字段(请参见here)。您声明:

  

两个字符之后,这些行应划分为单独的行,并且新行应在开头添加//。

但是您的输出假定为两个字母字符。您追求的模式是:

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
     }'