« 「gawk」の正規表現で | トップページ | gawkの関数:「length」でつまづく! »

2019年2月10日 (日)

「gawk」の正規表現・・・続き

の続きで、gawkの正規表現で悩んでいます。

・やりたいこと
OrCADの部品ライブライーソースファイルの中に出てくる
こんな文字列(「'xxxx'」というふうに「'」で区切られている)内の
「スペース」を「_」(下線記号)に変えたい。

・例 文字列
  'VOLTAGE REGULATOR'
  L1  3  SHORT   IN  'PLUS INPUT'
    R1  'C2' CLK  OUT 'CLK OUT'

・なぜか
gawkの「スペースで文字列を文字単位に」分割するという
機能、「'」で区切られた文字列内にスペースがあると、
そこで切られてしまいす。
「'  '」内のスペース、これを「_」(下線記号)に変えて、
分割されないようにしたいわけで。

・条件
1行に複数個の「'  '」が出現することもある。

・試したのはこんな処理
    while(1){                                 # 「'  '」がいくつもあるかもしれないので
        match($0, /'[^']*'/);
        if(RSTART == 0)     break;     # 「'  '」がなければおわり
        s1 = substr($0, 1, RSTART-1);             # 「'  '」の左側
        s2 = substr($0, RSTART, RLENGTH);   # 「'  '」の部分
        s3 = substr($0, RSTART+RLENGTH);   # 「'  '」の右側
        gsub("'", "@", s2)      # 「'  '」部分の「']をいったん@に
        gsub(" ", "_", s2)       # 「'  '」部分スペースを「_」に
        $0 = s1 s2 s3            # あらたな$0
    }   
    gsub("@", "'", $0)         # @を「'」に変えて元に戻す

「'  '」が複数個出るかもということで、「']をいったん@に変えて、
1行の先頭から処理するようにしました。
gawkらしく、もっとスマートな方法は?
   ※Cだとチカラ技で処理を進めるですが、gawkの書式はパズルです。
     1文字ずつ読み出して「'」が来たらスペースを「_」にというほうが
     良いかな。

そういや、こういった記述にも対応しないと。
R1    24   OUT 'QA''' ← QA'が信号名で 二つの「''」で
文字としての「'」を示すわけでして・・・。

 

|

« 「gawk」の正規表現で | トップページ | gawkの関数:「length」でつまづく! »

パソコン・インターネット」カテゴリの記事

Help me! (助けて!)」カテゴリの記事

電子工作」カテゴリの記事

AWK(GAWK)」カテゴリの記事

コメント

こんにちは
perlの例で恐縮です。記事で書かれていたものとほぼ同様な処理ですが、下記スクリプトで
「R1 'C2' CLK OUT 'CLK OUT' 'QA'' OUT'」

「R1 'C2' CLK OUT 'CLK_OUT' 'QA''_OUT'」
に変換できました。

s/''/@/g;    # signal名対策
s/'/#/g; # 区切り文字を一旦全置換
while( /#([^#]*)#/ ) {
$tmp = $tmp2 = $1; # #~#部を抽出
$tmp2 =~ s/ /_/g; # ' 'を'_'に置換
s/#$tmp#/'$tmp2'/; # tmp部分をtmp2に置換
}
s/@/''/g;

投稿: skyriver | 2019年2月10日 (日) 21時30分

一括変換方式に改善してみました。
変換結果は先程のコメントのものと同じです。
但し、'~'内にはスペース文字が1個だけという前提が必要です。

s/''/@/g;
s/([^']*)'([^'^ ]*) ([^'^ ]*)'([^']*)/$1#$2_$3#$4/g;
s/#/'/g;
s/@/''/g;

投稿: skyriver | 2019年2月10日 (日) 22時53分

skyriver さん、悩ませてすみません。

http://igarage.cocolog-nifty.com/blog/2019/02/length-a989.html
「gawkの関数:「length」でつまづく!」
でもって、時間を使っちゃって、まだ検証していません。
「一行野郎」、大好きです(笑)。

投稿: 居酒屋ガレージ店主(JH3DBO) | 2019年2月11日 (月) 18時58分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 「gawk」の正規表現・・・続き:

« 「gawk」の正規表現で | トップページ | gawkの関数:「length」でつまづく! »