
日付(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
他のシェルで実行できるperl
2つのコマンドがあります。bash
どちらもいくつかのプログラミング言語の通訳ですが、ここでは関係ありません。どちらもテキスト処理に堪能です。なぜなら、テキスト処理のために設計されているからです。sed
標準コマンドですが、POSIXで指定された範囲外であれば、互換性のないさまざまな実装がありますが、実装はperl
1つだけです(機能レベルが異なる複数のバージョンがあるにもかかわらず)。
ここでは、標準sed
構文を使用して次のことができます。
sed 's|\([[:digit:]]\{2\}\)/\([[:digit:]]\{2\}\)/\([[:digit:]]\{4\}\)|\1.\2.\3|g'
実装にかかわらず、sed
POSIXで指定された制限内で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
使用できない単語境界演算子を使用できます(一部の実装では/または/を拡張としてサポートしますが)。perl
sed
\<
\>
[[:<:]]
[[:>:]]
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'