質問: ### 前提・実現したいこと 偶然見つけたシェルスクリプトに含まれていたコード(一行) 条件の内容が知りたい。 ### 発生している問題・エラーメッセージ コード後半のsed以降の内容が複雑で理解できません。 s/置換条件/置換文字/ ということは理解しております。 ()や\などもコマンドのオプションとして存在しません。 *は単純にワイルドカードでしょうか? 置換後の文字の前にも\が含まれています、これは何を意味しているのでしょうか? ### 該当のソースコード m=`wc -l $f | sed 's/^\([0-9]*\).*$/\1/'` ### 補足情報(言語/FW/ツール等のバージョンなど) OS (linux centos7) 参考サイト http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230879/ https://www.macs.hw.ac.uk/~hwloidl/Courses/LinuxIntro/x945.html
回答: > > sed 's/^\([0-9]*\).*$/\1/' > > > `\(`と`\)`は、文字列の括弧じゃなくて正規表現の特殊機能です。`\(`と`\)`で囲んだ物が置換文字列で`\1`で参照できます。 正規表現は「先頭に数字が0個以上有り、その後何が来ても良い」ということですが、それを「数字の0個以上の部分」に置換します。 例えば、`"123 abc"`が`"123"`に置換されます。 `wc -l ファイル名`だと、`行数 ファイル名`が結果なので、そのうちの行数だけを取りたいのでしょう。 つまり、`sed 's/ .*//'`という「空白以降削除」でも良いです。こちらの方がわかりやすい。 そもそも、こんな間抜けなことをしなくても、 ``` m=`wc -l < $f` ``` で良いです。