行の2番目の文字に「.」がある場合は、最初に0を追加しようとします。私はそれらを組み合わせることができませんでした。
awk '{ print substr( $0, 2, 1 ) }' file.txt
2番目の文字を表示
sed -ie "s/.\{0\}/0/" file.txt
最初にゼロを追加してください。
「2番目の文字がドットの場合」が必要です。
サンプルファイル:
1.02.2017 23:40:00
10.02.2017 23:40:00
決定的な:
01.02.2017 23:40:00
10.02.2017 23:40:00
答え1
私たちは問題を完全に解決するために、またはsed
いずれかを使用することができます。awk
そしてsed
:
$ sed 's/^.\./0&/' file.txt
&
置換コマンド()の置換部分にある場合、s
コマンドのパターン部分と一致する入力行部分まで拡張されます。
正規表現^.\.
は「^
()で始まり、文字(.
)の後にリテラルポイント(\.
)が続くすべての行と一致します。」。
行がある場合、1.02.2017 23:40:00
パターンは一致し、1.
行の先頭で置き換えられます。01.
そしてawk
:
awk
質問のコード部分に基づいて...
上記のように、各行に入力された2番目の文字が印刷されます。
$ awk '{ print substr($0, 2, 1) }' file.txt
2 番目の文字が返されるという事実をsubstr($0, 2, 1)
条件として使用できます。
$ awk 'substr($0, 2, 1) == "." { ... }' file.txt
前の条件がtrueの場合は、現在行の内容の前に0を追加するコードを入力してください{ ... }
。$0
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt
その後、すべての行が印刷されていることを確認してください。
$ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt
もちろん、条件をsubstr($0, 2, 1) == "."
正規表現に変更することもできます(sed
ソリューションで使用したものとまったく同じものを使用します)。
$ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt
「短いほど良い」と思っている人の中には、次のように書いています。
$ awk '/^.\./ { $0 = "0" $0 } 1' file.txt
(そしておそらくほとんどのスペースも削除されたでしょうawk '/^.\./{$0="0"$0}1' file.txt
。)
答え2
sedを使用してください:
sed -e "/^.\./s/^/0/" file.txt
このパターンは、/^.\./
行の先頭ですべての文字とリテラルポイントを検索し^
、一致する場合はs
行の先頭を0に置き換えて、効果的に先頭に0を追加します。
sed式はs/.\{0\}/0/
少し奇妙です。 0個以上のコピーと一致し、それを0に置き換えます。もちろん、パターンは文字列内のすべての位置と一致しますが、s///
最初の項目のみが置き換えられるため、期待どおりに機能します。しかし、これは奇妙なアプローチです。
または、awkを使用すると、同様の正規表現がその行と一致しますが、次のように使用できますsubstr
。
awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt
まず、2番目の文字がドットかどうかをテストし、その場合は行の前にゼロを追加します。最後は、変更後に行を印刷するデフォルトの動作を呼び出します。
答え3
awkとsedについて話していますが、日付形式を指定したいようです。これには対応するdate
コマンドを使用します。たとえば、
echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d
出力されます
01.02.2017 23:40:00
sed
途中のコマンドは、に入力するピリオドをスラッシュに変更しますdate -d
。フォーマットオプションを使用すると、ほぼすべてのフォーマットで出力できます。特に%m
月はゼロで埋められ、これはあなたが望むようです。
Kusaranandaが指摘したように:
より簡潔(GNU日付とBash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
答え4
sed を使うとそうかもしれません。
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
^
これは行の先頭に固定し、グループ内の単一文字、テキスト、および.
その他の項目をキャプチャするために使用されます。一致する場合は、aを印刷して0
最初のキャプチャグループ(行の先頭の文字)を印刷し、aを印刷してから.
2番目のキャプチャグループ(行の残りの部分)を印刷します。