
その行の 2 番目の文字に「.」がある場合、先頭に 0 を追加しようとしています。この 2 つを組み合わせることはできませんでした。
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
に入るのは、前の条件が真の場合に、現在の行の内容である の前にゼロを{ ... }
追加するコードです。$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
その行の先頭をゼロに置き換えて、実質的に先頭にゼロを追加します。
sed 式はs/.\{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
特に は月をゼロで埋めますが、これがあなたがしようとしていることのようです。
クサラナンダ氏は次のように指摘している。
さらにコンパクト(GNU date と Bash):date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'
答え4
sedを使えば
sed 's/^\(.\)\.\(.*\)/0\1.\2/'
これは、^
行の先頭にアンカーするために を使用し、次にグループ内の任意の 1 文字をキャプチャし、その後にリテラル.
、その他をキャプチャします。これに一致すると、 を出力し0
、次に最初のキャプチャ グループ (行の先頭の文字)、次に を出力し、.
次に 2 番目のキャプチャ グループ (行の残りの部分) を出力します。