
行から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 番目の行を削除する方法はいくつかあります(ファイルのすべての行に影響します)。
sed
。 あなた既に持っているおそらくこれが最善の方法ですが、別の方法もあります。sed 's/\([^.]*\.[^.]*\)\./\1 /' file
これは、最長の非
.
([^.]*
) の連続、次に.
(\.
)、次に次の非 ( ) の連続.
、最後に.
(\.
) を探します。括弧はパターンをキャプチャするため、 として参照できます\1
。したがって、上記のコマンドは 2 番目を削除し.
てスペースに置き換えます。GNU (Linux ではデフォルト) をお持ちの場合は
sed
、次のように簡略化できます。sed -r 's/([^.]*\.[^.]*)\./\1 /' file
パール
perl -pe 's/([^.]*\.[^.]*)\./\1 /' file
または
perl -F'\.' -ane 'print "$F[0].$F[1] ", join ".", @F[2..$#F]' file
awk
(もっと良い方法があるはずです)awk -F. '{printf "%s.%s ",$1,$2; for(i=3;i<NF;i++){printf "%s.",$(i); }print $NF}' file