2016-11-16 11 views
0

私はUNIXに慣れていて、スクリプトファイルを使っていて、スニペットになっていました。 スニペットを分析しようとしました。私はsed -eオプションの'sed - stream editor'コマンドについて少し読んでいます。 私はまた、スニペットを実行し、出力を見るabltだった。しかし、私は何が起こっているのか理解できません。以下はスニペットです。UNIXのsedコマンド - 理解できない

ID=101 
echo ABCDEFGHIJK KLMJN | \ 
sed -e "1,\$s/ *$/^\"`echo $ID`\"/" \ 
>a.txt 

出力はABCDEFGHIJK KLMJN^"101"

は、彼らがsedコマンドを使用しているスクリプトファイル内の場所がたくさんあります。どのようにこれらのスニペットの解読方法を助けることができますか?

+2

であることを後に。 – 123

+0

私は@ 123です。この 'sed'を良い習慣の例として使わないでください。恐ろしいことです。 – cdarke

答えて

3

あなたは一部で、それに部分を見てください。

sed -e "1,\$s/ *$/^\"`echo $ID`\"/" 
     | | |    | 
     1 2   3 
  1. あなたが唯一の特定の行に仕事をしたいです。その例では、最初の行で始まり、最後の行で終わります。この場合、このように書く必要はありません。したがって

    sed -e "s/ *$/^\"$(echo $ID)\"/" 
    

    はまったく同じです。

  2. ここにreplaceコマンドがあります。この場合、最後の非スペースと行末の間に0個以上のスペースを置き換えます。このことについてもっと知りたい場合は、regexのためのグーグルを提案してください。

  3. バックティック(``)は、実際には「シェルシズム」です。置換前にシェルがコマンドを実行します。よりわかりやすい方法で、$(echo $ID)を使用してください。その後、2から正規表現を置き換えます。結果は^"101"になります。

そして、結果はひどいコマンドですABCDEFGHIJK KLMJN^"101"

+0

しかし、これはスペースを置き換えるものではありません。出力を見るとまだスペースがあります。 – NJMR

+0

'$'は行末を示す特別な正規表現文字であることを知る必要があります。そのため、コマンドは文字列の末尾まで他の文字(たとえば、文字)の後に_zero_以上のスペースを検索し、その文字列で置き換えます。 –

+0

この特殊なケースでは、 'echo" ABCDEFGHIJK KLMJN^\ "$ {ID} \" "で全く同じ動作を達成できます。 –