「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'が信号名で 二つの「''」で
文字としての「'」を示すわけでして・・・。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- ガレージPCがぁ~(2025.07.10)
- VZ Editorのフロッピーディスク(2024.11.29)
- インピーダンスの歌(2024.08.19)
- イチケンさんの動画に居酒屋ガレージ日記(旧ページ)が(2024.03.27)
- メモ:crane1000.com(2023.08.02)
「Help me! (助けて!)」カテゴリの記事
- あかんやん「Microchip Studio」(2025.06.13)
- Microchip StudioでMPLAB@Snapが動かない(2025.06.12)
- オムロンのタイマー「H7ET-FBV」のGATE入力回路はどうなっているの?(2025.04.24)
- 2.0mmピッチの電線対電線接続用コネクタ(2024.12.11)
- この「テープ」は何という名前?(2024.10.01)
「電子工作」カテゴリの記事
- ひさしぶりのイベントだったけど・・・「ピコピコ・スイッチ」破損(2021.12.13)
- 顕微鏡用LEDリングライトのLED、そろそろ交換か(2021.09.27)
- 可変抵抗器の「陽極酸化」(2021.09.22)
- 弾帯状になったQIコネクタのコンタクトピンを・・・(2021.08.27)
- AD620を使った計装アンプとシミュレーテッド・インダクタを使ったノッチフィルタ(2021.08.16)
「AWK(GAWK)」カテゴリの記事
- 新しいGAWK --csvオプションで””の中のコンマを区別してくれる(2025.02.25)
- BSch3V CE3ファイルからコメント文字をピックアップ(2022.11.09)
- 「トラ技」の記事検索(2022.08.31)
- サーミスタ温度計、何ビットのA/Dコンバータがいるか?(2021.08.11)
- gawk 文字列から1文字を取り出して8bit数値として扱いたい(2020.10.21)
コメント
こんにちは
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分