sed +行から2番目の文字「.」を削除する方法

sed +行から2番目の文字「.」を削除する方法

行から2番目の文字「.」を削除する方法

私が持っているのはこれです(しかし、出力から最初の「.」を削除します)。

uname -r | sed s'/\./ /'

2 6.18-164.2.1.el5PAE

次の出力が必要ですが、

2.6 18-164.2.1.el5PAE

答え1

次のように、N番目のエントリと一致するようにコマンドの最後にNを追加します。

uname -r | sed 's/\./ /2'

なぜ必要ですか?


infoページからsed

`s'コマンドの後には、次のフラグのうち0つ以上が続くことがあります。

G

Apply the replacement to _all_ matches to the REGEXP, not just the first.

数字

Only replace the NUMBERth match of the REGEXP.

答え2

.以下は、ファイルの1行から2行目を削除するいくつかの方法です(ファイル内のすべての行に影響を与えます)。

  1. sed。あなたすでに持っているおそらく最良の方法は何ですか?しかし、他の方法は次のとおりです。

    sed 's/\([^.]*\.[^.]*\)\./\1 /' file 
    

    .これは([^.]*)ではなく最も長いセグメントを探し、(.\.、次ではない()セグメント、そして.最後に.()を探します\.。括弧はパターンをキャプチャするため、これと呼ぶことができます\1。したがって、上記のコマンドは2番目のコマンドを削除し.て空白に置き換えます。

    sedGNU(Linuxのデフォルト)がある場合は、次のように単純化できます。

    sed -r 's/([^.]*\.[^.]*)\./\1 /' file 
    
  2. パール

    perl -pe 's/([^.]*\.[^.]*)\./\1 /' file 
    

    または

    perl -F'\.' -ane 'print "$F[0].$F[1] ", join ".", @F[2..$#F]' file 
    
  3. awk(もっと良い方法があると確信しています)

    awk -F. '{printf "%s.%s ",$1,$2; for(i=3;i<NF;i++){printf "%s.",$(i); }print $NF}' file 
    

関連情報