sedを使用してファイルでどのように使用できますか?

sedを使用してファイルでどのように使用できますか?

日付(1990年20月1日)の「/」を「。」に置き換える方法を見つけようとしています。ファイル全体があることを理解しています's/\//./g'が、ファイルにURLがあるため、対応する '/'を '.'に置き換えます。これは必要なものではありません。特定の列にのみ適用する方法はありますか?私はPerlを使ってこれを行う方法があると言いましたが、私はbashで作業しています。

答え1

あなたの行に属さない他の区切り文字を使用してください。

echo 'http://www.google.com  (20/01/1990)' | sed -r 's@([0-9]+)/([0-9]+)/([0-9]+)@\1.\2.\3@g'
http://www.google.com  (20.01.1990)

答え2

bashこれはシェル、コマンドラインソルバーです。それがすることはコマンドを実行することです。そして、sed他のシェルで実行できるperl2つのコマンドがあります。bash

どちらもいくつかのプログラミング言語の通訳ですが、ここでは関係ありません。どちらもテキスト処理に堪能です。なぜなら、テキスト処理のために設計されているからです。sed標準コマンドですが、POSIXで指定された範囲外であれば、互換性のないさまざまな実装がありますが、実装はperl1つだけです(機能レベルが異なる複数のバージョンがあるにもかかわらず)。

ここでは、標準sed構文を使用して次のことができます。

sed 's|\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)|\1.\2.\3|g'

実装にかかわらず、sedPOSIXで指定された制限内でPOSIX規格に準拠している限り(この場合、入力が有効なテキストであり、実際に非常に長い行、無効なバイトシーケンスを含まない限り)文字または区切り文字ではない文字)、一部の実装(たとえば、GNU)ではsedこれを拡張として許可できますが、すべて機能する必要があります。

すべてのバージョンperlと入力に対して次のように書くこともできます。

perl -pe 's|(\d\d)/(\d\d)/(\d{4})|$1.$2.$3|g'

または、最新バージョンを使用するか、次の手順を実行しますperl

perl -pe 's{\d\d/\d\d/\d{4}}{$&=~y|/|.|r}ge'

1000/10/99999に置き換えることを避けるには、標準では使用できますが、標準では1000.10.99999使用できない単語境界演算子を使用できます(一部の実装では/または/を拡張としてサポートしますが)。perlsed\<\>[[:<:]][[:>:]]

perl -pe 's|\b(\d\d)/(\d\d)/(\d{4})\b|$1.$2.$3|g'

または周りを見てください演算子(正規表現の機能でperlもあるが、標準 sed 正規表現ではない)

perl -pe 's|(?<!\d)(\d\d)/(\d\d)/(\d{4})(?!\d)|$1.$2.$3|g'

標準と同等のsed作業を実行できます。プログラムの作成sed条件付きループ構造):

sed -e :1 -e 's|^\(.*[^[:digit:]]\)\{0,1\}\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)\([^[:digit:]].*\)\{0,1\}$|\1\2.\3.\4\5|g; t1'

関連情報