私は正規表現の章を読んでいます。クラシックシェルスクリプトサンプルコードを入力してください。
コマンドは次のとおりです。 「/home/tolstoy」パスを「/home/lt」に変更します。
$ echo /home/tolstoy | sed 's;\(/home\)/tolstoy/;\1/lt/;'
/home/lt
しかし、私のラップトップのzshで実行すると、戻り結果は次のようになります。
/home/tolstoy
このコマンドは間違っていますか?正しいコマンドは何ですか?なぜ?
答え1
/
正規表現で文字列の後に一致しようとしていますtolstoy
。入力に値が存在しないため、/
式が一致しません。
/
入力に含めるように変更します。
$ echo /home/tolstoy/ | sed 's;\(/home\)/tolstoy/;\1/lt/;'
/home/lt/
末尾と一致しないように修正されました/
。
$ echo /home/tolstoy | sed 's;\(/home\)/tolstoy;\1/lt/;'
/home/lt/
(末尾の入力tolstoy
に関係なく)正しく見つかった親ディレクトリを変更し、そのパスの末尾に追加します。/
lt
$ printf '%s/lt\n' "$(dirname /home/tolstoy)"
/home/lt
または、
$ printf '%s\n' "$(dirname /home/tolstoy)/lt"
/home/lt
通常、Unix パス名には行中心のテキスト編集ツールを使用しないでください。これにより、作成中のスクリプトまたはコマンドが改行文字を含む特定のパス名(一般的ではありませんが有効です)で正しく機能しなくなります。