sed のアドレッシングで今更悩んだ話

需要なかろ。

ハマったその日に書こうかとも思ったりもしたんだけど、「ぜってーこんなん需要ねーし」として躊躇してて、たぶん一ヶ月以上塩漬けにしてたネタ。

「需要がないだろう」の意味するところは二つ。

一つ。「使う人にとっては sed はあまりに日常」。一つ。「使わない人にとっては sed なんて聞いたことすらない」。前者な人はこんな情報必要とするはずがないし、後者な人ならそもそもこんな単発ネタは何の役にも立たない。そして何よりも「時代錯誤」とでも言うほどに、「イマサラ」。

sed の歴史、なんてのはどっかみちくり。知らない人が調べれば確実にビックリすると思うよ。んでワタシのこれとの付き合いも、1996年からなので 23年前からてことになるね。「それなのに」てネタ。

自分でもビックリしたよ。だって「毎日てくらい使ってた」ハズの使い方でハマったんだから。基礎となる版はこれね:

 1 [me@host: ~]$ cat /c/Python27/Scripts/pygmentize-script.py
 2 #!c:\Python27\python.exe
 3 # EASY-INSTALL-ENTRY-SCRIPT: 'Pygments==2.1.3','console_scripts','pygmentize'
 4 __requires__ = 'Pygments==2.1.3'
 5 import sys
 6 from pkg_resources import load_entry_point
 7 
 8 if __name__ == '__main__':
 9     sys.exit(
10         load_entry_point('Pygments==2.1.3', 'console_scripts', 'pygmentize')()
11     )
12 [me@host: ~]$ sed '7,$!d' /c/Python27/Scripts/pygmentize-script.py
13 if __name__ == '__main__':
14     sys.exit(
15         load_entry_point('Pygments==2.1.3', 'console_scripts', 'pygmentize')()
16     )

何をしているかというと「7行目から末尾まで「以外」を削除」している。「置換ツール」として使う以外の sed の使い方としては最も頻繁に使う使い方で、この「~,~」が開始アドレスと終了アドレスの対ね。

で、この「発想」もワタシは良くしてた「はず」だったわけよ、入力の対象ファイルをこんな風にしとくわけだ:

「aaa.sh」という名前だとして
 1 #! /bin/sh
 2 ifn="Air on the G String (from Orchestral Suite no. 3, BWV 1068).mp3"
 3 ifnb="`basename \"${ifn}\" .mp3`"
 4 pref="`basename $0 .sh`"
 5 
 6 # --CUT BEGIN
 7 cat <<__EOF__ > ${pref}.ass
 8 [Script Info]
 9 PlayResY: 600
10 
11 ;...(snip)...
12 # --CUT END
13 
14 #
15 ffmpeg -y -i "${ifn}" -filter_complex "
16 [0:a]ahistogram=s=1920x1080,subtitles='${pref}.ass'[v]
17 " \
18     -map '[v]' -map '0:a' -c:a copy \
19     -t 183 "${pref}_${ifnb}.mp4" 

この「–CUT BEGIN」から「–CUT END」部分までを sed でオミットしたいんだぜっ、てわけで、これは無論 sed で簡単に出来る、実際「アドレス」は正規表現書ける(「/re/」で)から………のはずだった。

これがまぁ、なんでか数日出来なくてなんでだぁ叫んでた。つまり。NG:

期待の結果は飛び出ない
1 [me@host: ~]$ sed '/CUT BEGIN/,/CUT END/d' aaa.py

答えは実に簡単で。OK:

期待の結果が呼ばれる
1 [me@host: ~]$ sed '/^#.*CUT BEGIN.*$/,/^#.*CUT END.*$/d' aaa.py

どうやらちゃんと「行全体」が特定できてなかったてのが理由。うわぁ、イマサラだぁ。こんなのを23年も気付いてなかったんか?? びっくりだよもう。

つーかさこれ、「無意識の境地」ていうのかな。うまくいってた時ってのは条件反射的に正しいものを書いてたんだろうと思う。つまり23年間気付かなかったというよりは23年間一度も「ハマったという自覚なく措置」してたってことだ。なんにしてもびっくりだ。