Rのソリューション

Rのソリューション

#'100を超える列がある場合は、ブロックの一部(#'()で始まる行)を設定するときにコード行を破棄(追加)したいと思います。#\x27

私のソリューションは複数のブロックで動作しません。

サンプルファイル:

#' chunk line
#' big chunk line to split big chunk line to split big chunk line to split big chunk line to split big chunk line to split
#' ruler90123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
#'
not chunk line do nothing

big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line

#' chunk line
#' big chunk line to split big chunk line to split big chunk line to split big chunk line to split big chunk line to split
#' ruler90123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
#'
not chunk line do nothing

big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line

私の試み:(ブロックが1つだけ存在する場合は機能します)

perl -0777 -pe '
  s{#\x27.*#\x27}{                          q{ gets lines from #\x27 to #\x27 (chunk) };
    ($r = $&) =~ s/\n!\n#\x27//g;           q{ removes breaks except followed by #\x27 }; 
    $r =~ s/\G.{0,100}(\s|.$)\K/\n#\x27 /g; q{ before column 100 adds break + #\x27 };
    $r =~ s/#\x27 #\x27/#\x27/g;            q{ removes duplicated #\x27 };
    $r =~ s/\n\n/\n/g;                      q{ removes duplicated breaks };
    $r
  }gse' < chunks.txt

予想出力:(2回)

#' chunk line
#' big chunk line to split big chunk line to split big chunk line to split big chunk line to split
#' big chunk line to split
#' ruler90123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
#'
not chunk line do nothing

big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line big do nothing line

Rのソリューション

psum <- function(...,na.rm=FALSE) {
  rowSums(do.call(cbind,list(...)),na.rm=na.rm)
}    

gblines<-readLines("chunks.txt")

newgblines<-character()
i<-1
j<-1
repeat {
  newgblines[j] <- gblines[i]
    if (grepl("^#\'",newgblines[j] ) & nchar( newgblines[j] ) > 100 ) { # select lines with more than 100 and beginning in #'
      repeat{
        greps<-gregexpr(pattern ="\\s",newgblines[j])[[1]] # get position of spaces
        lenG<-length(greps)
        sums<-psum(-greps , rep(100,lenG ) )               # calculate which space is closest to col. 100
        index <- which(sums>0)
        minSums<- min(sums[index])
        index2<-which(sums==minSums)                       # index of space in greps
        cutpoint<-greps[index2]
        nchar2<-nchar(newgblines[j])                       # number of chars. in line
        strFirst <-substr(newgblines[j],1,cutpoint)        # cut before col. 100
        strSecond<-substr(newgblines[j],cutpoint+1,nchar2) # segmente after col. 100
        newgblines[j]<-strFirst
        j<-j+1
        newgblines[j]<-paste0("#\' ",strSecond)
        if (nchar(strSecond)<=100 ){
          break
        }
      } # 
    } #  if
  i <- i+1
  j <- j+1
  if (i>length(gblines) ){
    break
  }
}
newgblines

ベストアンサー1

ほぼすべて来ました。

次の2つを変更します。

  • 変化
    s{#\x27.*#\x27}{
    
    到着
    s{#\x27.*?#\x27$}{
    
  • そして変化
    }gse' < fileName
    
    到着
    }mesg' < fileName
    

基本的に貪欲な検索と交換を行っています。代わりに、必要なのはブロック指向の検索と置換操作です。

#' 右側に改行が見えるマーカーを使用すると、ブロックの終わりで正規表現は.*?貪欲ではないバージョンです。.*

詳細については、次を参照してください。Perlドキュメント

おすすめ記事