「gawk」の正規表現・・・続き
の続きで、gawkの正規表現で悩んでいます。
・やりたいこと
OrCADの部品ライブライーソースファイルの中に出てくる
こんな文字列(「'xxxx'」というふうに「'」で区切られている)内の
「スペース」を「_」(下線記号)に変えたい。
・例 文字列
'VOLTAGE REGULATOR'
L1 3 SHORT IN 'PLUS INPUT'
R1 'C2' CLK OUT 'CLK OUT'
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) # @を「'」に変えて元に戻す
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'が信号名で 二つの「''」で
文字としての「'」を示すわけでして・・・。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- メモ:crane1000.com(2023.08.02)
- Gigazineの記事「DDR Type 2の内部構造がすごい」(2023.01.10)
- 廃棄する本や説明書、データーブックなど(2021.03.20)
- CR2032バックアップ用リチウム電池・・・0V(2020.09.17)
- エライこっちゃ。ネットも電話もできない!! (2020.07.10)
「Help me! (助けて!)」カテゴリの記事
- 「アラルダイト」が無い!(2023.12.05)
- 2つあるワンショットマルチの時定数比を一定にしたい(2023.10.21)
- TRWの16pin DIP IC「8543」 これは何?(2023.10.06)
- 入力セレクタ+VR+トーンコントロール用IC、何かないかな?(2023.10.02)
- 電磁石の接触面の状態で保持力が変わるの?(2023.09.28)
「電子工作」カテゴリの記事
- TRWの16pin DIP IC「8543」 これは何?(2023.10.06)
- 予告:「マイコン型導通チェッカー」「電池電圧チェッカー」値上げします(2022.11.16)
- 三和の針式テスター「GP-5」不調(2022.10.18)
- 「ダイソー ミニケース 5個組」が見つからない #2(2022.10.12)
- 「ダイソー ミニケース 5個組」が見つからない(2022.09.29)
「AWK(GAWK)」カテゴリの記事
- BSch3V CE3ファイルからコメント文字をピックアップ(2022.11.09)
- 「トラ技」の記事検索(2022.08.31)
- サーミスタ温度計、何ビットのA/Dコンバータがいるか?(2021.08.11)
- gawk 文字列から1文字を取り出して8bit数値として扱いたい(2020.10.21)
- ダイソーReVOLTES単3 JIS C8708:2019充放電試験途中経過(2020.03.05)
コメント
こんにちは
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分