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 個以上指定できます。

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

番号

Only replace the NUMBERth match of the REGEXP.

答え2

.ファイルの行から2 番目の行を削除する方法はいくつかあります(ファイルのすべての行に影響します)。

  1. sed。 あなた既に持っているおそらくこれが最善の方法ですが、別の方法もあります。

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

    これは、最長の非.( [^.]*) の連続、次に.( \.)、次に次の非 ( ) の連続.、最後に.( \.) を探します。括弧はパターンをキャプチャするため、 として参照できます\1。したがって、上記のコマンドは 2 番目を削除し.てスペースに置き換えます。

    GNU (Linux ではデフォルト) をお持ちの場合はsed、次のように簡略化できます。

    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 
    

関連情報