先日行われたシェル芸勉強会でそういった問題が出てたのだけど、絵文字をすべて削除したり置換する方法って今後使うこともありそうなので、これだけ抜き出して記述しておくことにする。

Perlを使う場合

Perlの場合、Unicode Propitiesというのがあるので、それで絵文字として指定…できればよかったんだけど、残念ながらそのブロック単位では無いらしい。 もうちょっと小さい単位で定義されているので、こういうときに一発で指定が出来ない。なので、使う文字ブロックだけを指定してやるとよさそうだ。

command ... | perl -C -ple 'use utf8;s/[^\p{BasicLatin}|\p{Katakana}|\p{Hiragana}|\p{Han}|\p{CJKSymbolsAndPunctuation}|\p{HalfwidthAndFullwidthForms}]//g'

先日実施された、第42回シェル芸勉強会に参加してきたので、その復習。
今回は難しめにしたとのこと。

問題はこちら。最初に、問題等に使用するファイルをgitからcloneしておくといい。(といっても、ファイルは1個しかない)

git clone https://github.com/ryuichiueda/ShellGeiData

Q1

「正の整数の組(x, y, z)について、x + xy + xyz = 1234, x < y < zを満たす組み合わせを全て選べ」という問題。 数学オリンピックから出題されていた問題をちょっと改変した問題らしい(多分オリジナルはこれ)...


シェル芸で遊んでいた際、行頭と行末以外を置換したいといった事があったので、備忘として残しておく。 置換処理というとまっさきにsedの利用を思いつくのだが、残念ながらsedで行頭・行末の文字以外を指定する方法が思いつかず、Perlの先読み・後読み正規表現を使って置換することにした。

echo あいうえお | perl -C -pe 'use utf8;s/((?<!^).(?!$))/_/g'

ふと、特定の文字列同士を入れ替える(パターンに応じて文字列の置換をさせる)処理をワンライナーでさせるにはどうすればいいかなと思ったので、ちょっと調べてみた。

sedの場合

sedの場合、よく思いつくのが以下の様に一度別の文字列に置換してから処理をするやり方。

コマンド | sed 's/パターンA/\x0/g;s/ぱたーんB/パターンA/g;s/\x0/ぱたーんB/g'
blacknon@BS-PUB-UBUNTU-01:~$ echo -e "「あいうえお」と「かきくけこ」\nそして、「かきくけこ」と「ABCDE」、「あいうえお」"
「あいうえお」と「かきくけこ」
そして、「...

先日、Twitterで警察の人事で肩書が異常に長い方について話題になってた。

ニュースのリンクはこちら。たしかに長い…(´・ω・`)。 なに書いてあるんだかさっぱりである。「」って字がいっぱいあるのとサイバーセキュリティだということはわかった、みたいな感じ。

とりあえず兼任している肩書を改行させてみよう。

...

コンソール上で特定の文字列をワンライナーで指定回数リピートさせたい(例えば、0を10回リピート等)ということがあったので、備忘で残しておく。 いくつか方法があるようなので、それぞれ分けて残しておく。

1. ブレース展開を利用する

真っ先に利用する方法として思いつくのはブレース展開だと思う。 ただ、以下のように普通にechoにくっつけて利用すると展開時にはスペース区切りになってしまう。

echo 0{,,,,,}
blacknon@BS-PUB-UBUNTU-01:~$ echo 0{,,,,,}
0 0 0 0 0 0

一応、前にブレース展開の出力区切り文字を変更するの...


以前にもLeetSpeakへの変換を行うコマンド『leetpass』を触ったことがあったが、Perlにも同様の事ができるライブラリ『Acme::LeetSpeak』があったので、これを使って標準入力からLeetSpeakを取得してみる。 まず、以下のコマンドでライブラリの導入をする。

cpan Acme/LeetSpeak.pm

ライブラリの導入後は、以下のようにperlを実行することで指定した文字列からLeetSpeakに変換してくれる。

echo Strings | perl -lne 'use Acme::LeetSpeak;print(leet($_))'

...

Linuxコンソール上で、ソートせずにユニークな値を取得したい時がある。
例えば、以下のようなファイルからユニークな値を取得する際、よく使われる方法としてはsort+uniqコマンドの組み合わせなのだが、それだと順番がずれてしまう。
あくまでもその文字列が最初に登場した順番でユニークな値を取得したいとする。

[root@BS-PUB-CENT7-01 ~]# cat /tmp/test.txt
test:0
test:2
test:6
test:9
test:4
test:9
test:9
test:9
test:4
test:0
test:2
test:8
test:0
test:7...