「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'が信号名で 二つの「''」で
文字としての「'」を示すわけでして・・・。
| 固定リンク
「パソコン・インターネット」カテゴリの記事
- 廃棄する本や説明書、データーブックなど(2021.03.20)
- CR2032バックアップ用リチウム電池・・・0V(2020.09.17)
- エライこっちゃ。ネットも電話もできない!! (2020.07.10)
- ひさびさの1.2Mフォーマットのフロッピ(2019.09.10)
- メモ:早明浦ダム空撮(2019.04.01)
「Help me! (助けて!)」カテゴリの記事
- Arduino IDEでRaspberry Pi Pico:A/D入力が…あれっ?(2022.04.15)
- オペアンプの出力につなぐ大容量コンデンサ ほんとにいいの?(2022.02.26)
- Behzad Razavi 著「アナログCMOS集積回路の設計」 表紙の回路図(2022.02.21)
- Behzad Razavi 著「アナログCMOS集積回路の設計」(2022.02.19)
- オンボードDC-DCコンバータが入ってこない!(2022.01.14)
「電子工作」カテゴリの記事
- オペアンプの出力につなぐ大容量コンデンサ ほんとにいいの?(2022.02.26)
- オペアンプ ICL7611(2022.02.24)
- 「シャカシャカ・ホイップ」衝撃検出回路(2022.02.18)
- 単安定マルチバイブレータ 「74123」と「4538」の挙動(2022.02.09)
- 「シャカシャカ・ホイップ」予備実験 #5(2022.02.04)
「AWK(GAWK)」カテゴリの記事
- サーミスタ温度計、何ビットのA/Dコンバータがいるか?(2021.08.11)
- gawk 文字列から1文字を取り出して8bit数値として扱いたい(2020.10.21)
- ダイソーReVOLTES単3 JIS C8708:2019充放電試験途中経過(2020.03.05)
- メモ:awk(gawk)で「arcsin」(2020.01.14)
- DOS版OrCADの部品ライブラリをBSch3VのLB3ファイルに(2019.03.01)
コメント
こんにちは
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分