2024/12/17 sed にまつわるエトsedラ
https://gyazo.com/b596b4603f1c39f596e0ca9d0e5fe3eb
sed 使いますか? わたしはまあそこそこ使います
使いきれているわけではないのである日知ってへぇ〜となったはなしをします
code:sed1.sh
$ echo 'staging-appliaction' | sed 's/staging/production/'
この sed に渡したコマンドの出力結果は prduction-application になります
code:sed2.sh
$ echo 'staging-appliaction' | sed 's%staging%production%'
ではこうではどうでしょうか? これもまた prduction-application になります
わたしは知らなかったのですが、man sed するとこう置換コマンドに書いてありました
[2addr]s/regular expression/replacement/flags
Substitute the replacement string for the first instance of the regular
expression in the pattern space. Any character other than backslash or
newline can be used instead of a slash to delimit the RE and the replacement.
Within the RE and the replacement, the RE delimiter itself can be used as a
literal character if it is preceded by a backslash.
つまりバックスラッシュ \ と改行文字以外の文字であれば正規表現のデリミタに使えるとあります
じゃあこうではどうでしょう?
code:sed3.sh
$ echo 'staging-appliaction' | sed '/staging/d'
これは何も出力されません。d が staging を含む行を削除するコマンドだからですね
code:sed4.sh
$ echo 'staging-appliaction' | sed '%staging%d'
じゃあこれはどうでしょうか?
sed: 1: "%staging%d": invalid command code % と実行できませんでした
削除コマンドを読むと
[2addr]d
Delete the pattern space and start the next cycle.
置換コマンドとちょっと様相が違いますね
つまり置換コマンドは s/regexp/replace/flags までコマンドであり
削除コマンドにおいては d の直前は address という扱いになります
さらに man sed で Sed Regular Expressions を読んでいると以下のようにあります
In a context address, any character other than a backslash (“\”) or newline
character may be used to delimit the regular expression. The opening delimiter
needs to be preceded by a backslash unless it is a slash. For example, the
context address \xabcx is equivalent to /abc/.
あるコンテキストのアドレスではもしスラッシュじゃなければ開始のdelimiterはバックスラッシュではじめる必要ある
なるほど
sed には address, command がある
command内の正規表現 delimiter と、addoress内の正規表現 delimiter の扱いがちょっと違う
今日は以上です