Tei5’s Blog

Tei5 の メモ書き

UWSC とコマンドラインのエスケープ でハマった

コマンドラインというか、バッチファイルというか。
文字のエスケープはハマりがち。


そもそも、TSV(タブ区切り)を、Markdown の テーブルにしたい。

WEB サービスもあるけど、AWK なら簡単に作れるんじゃない?と思って作ってみて、意外とハマったので、メモ。

ハマりポイント

  • そもそも、UWSCクリップボードのテキストを、整形というか、コンバートするツールを使ってる。(今どき UWSC って!)
  • UWSC 内部で 「RESULT = DOSCMD( "gawk -f TSV2MD.awk hoge.tsv")」 とかすれば良いのだが、一行野郎で処理したいと思ったのが、運の尽き。

  • UWSC は、ダブルコーテーションのエスケープが冗長。 「<#DBL>

  • AWK で、区切りは、FS,OFS で簡単じゃね?と思ったら、$0 は$n を更新しないと、セパレータが更新されないようだ。そのために、 「$1=$1;」で更新。
  • コマンドラインで「|」は、パイプと認識される。エスケープ文字は「^

そもそもの、TSV2MD.awk のソース

BEGIN{
    FS="\t"; OFS="|";   # 入力セパレータは タブ 、出力セパレータは、| 縦棒

    getline;            # 一行目は、ヘッダとして一行読んで、
    $1=$1;              # $0 を更新(セパレータを更新)
    print "|" $0 "|";   # 前後に | をつけて、ヘッダを出力

                        # フィールドの数だけ、区切りを入れる。改行せずに
    for(i=1; i<=NF; i++){
        printf("|---");
        }
    printf("|\n");      # 最後には、| と 改行
}

{                       # ここから2行目以降の処理
    $1=$1;              # 同じく、$0 を更新して、
    print "|" $0 "|";   # 前後に | をつけて、データ行を出力
}

その後に、UWSC に組み込みの為の置換


コメントタブ と、改行 を無くして、一行に

BEGIN{FS="\t"; OFS="|"; getline; $1=$1; print "|" $0 "|"; for(i=1; i<=NF; i++){ printf("|---"); }printf("|\n");}{$1=$1;print "|" $0 "|";}

|」 を、「^|」 に

BEGIN{FS="\t"; OFS="^|"; getline; $1=$1; print "^|" $0 "^|"; for(i=1; i<=NF; i++){ printf("^|---"); }printf("^|\n");}{$1=$1;print "^|" $0 "^|";}

"」 を、「\<#DBL>」 に   (本来 UWSC では「<#DBL>」だが、コマンドラインで展開されることを見越して)

BEGIN{FS=\<#DBL>\t\<#DBL>; OFS=\<#DBL>^|\<#DBL>; getline; $1=$1; print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>; for(i=1; i<=NF; i++){ printf(\<#DBL>^|---\<#DBL>); }printf(\<#DBL>^|\n\<#DBL>);}{$1=$1;print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>;}

UWSC 用に、 「CMD_STR = "gawk <#DBL> ◯◯◯◯ <#DBL> "」 の中に入れる。
ここは、UWSCエスケープなので、「\<#DBL>」でなく、「<#DBL>

CMD_STR = "gawk <#DBL>BEGIN{FS=\<#DBL>\t\<#DBL>; OFS=\<#DBL>^|\<#DBL>; getline; $1=$1; print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>; for(i=1; i<=NF; i++){ printf(\<#DBL>^|---\<#DBL>); }printf(\<#DBL>^|\n\<#DBL>);}{$1=$1;print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>;} <#DBL> "

なんじゃこれ。なっが~!
メンテナンス性最悪。オススメしかねるな。


TSV の例

date num str
2022/02/24  10  ABC
2022/02/25  123 hoge
2022/02/26      moge

Markdown Table

|date|num|str|
|---|---|---|
|2022/02/24|10|ABC|
|2022/02/25|123|hoge|
|2022/02/26||moge|

表示結果

date num str
2022/02/24 10 ABC
2022/02/25 123 hoge
2022/02/26 moge

お世話になったページ

cmd.exe のコマンドラインの仕様を解析してみた

awk で$0 出力するときに OFS 指定が無視られる問題