sed - 0 除去 - /08/ ~ /8/

sed - 0 除去 - /08/ ~ /8/

/08/を/8/に変換するには、どのsedコマンドを使用する必要がありますか?

コマンド出力から追加のゼロをすべて削除したいです。

私はそれを不快な余分なゼロに減らしました。

sed -ie 's/\/0[1-9]\//\/[1-9]\//g' ~/tmp

出力:at 12:27 AM on 5/[1-9]

sed -ie 's/\/0?\//\/?\//g' ~/tmp

出力:at 12:27 AM on 5/08

フルスクリプト:

#!/bin/bash

echo $@ > ~/tmp
sed -ie 's/\/0[1-9]\//\/[1-9]\//g' ~/tmp
AA=`awk '{print $2}' ~/tmp | awk -F : '{print $1":"$2}' | sed 's/^0*//'`
BB=`awk '{print $3}' ~/tmp`
CC=`awk '{print $1}' ~/tmp | awk -F / '{print $1"/"$2}' | sed 's/^0*//'`
DD=`awk '{print $5}' ~/tmp | awk -F : '{print $1":"$2}' | sed 's/^0*//'`
EE=`awk '{print $6}' ~/tmp`
FF=`awk '{print $4}' ~/tmp | awk -F / '{print $1"/"$2}' | sed 's/^0*//'`

if [ $# = 3 ]; then
    echo "at $AA $BB on $CC"

elif [ $# = 6 ] && [ $CC = $FF ]; then
    echo "from $AA $BB to $DD $EE on $FF"

elif [ $# = 6 ]; then
    echo "from $AA $BB on $CC to $DD $EE on $FF"
fi
rm ~/tmp

入力と出力の例(エイリアス= dt):

現在のsedコマンドの使用

dt 05/08/2017 02:27:25 AM

5/[1-9] 午前2時27分


最初のsedコマンドはありません

dt 05/08/2017 02:27:25 AM

5月8日午前2時27分


解決済み - 3行目を次に置き換えます。sed -rie 's/\/0(.?)/\/\1/g' ~/tmp

dt 05/08/2017 01:03:56 AM

出力:5月8日午前1時3分

答え1

ノート:解決策をできるだけ一般的にするために編集された答えです。編集履歴を見て、元々行われたことを確認し、以前に回答した質問に対するコメントを確認してください。

ここで重要なのは、拡張正規表現を()と にグループ化することです。-rパターンをグループ化すると、パスシンボル内の位置に基づいてパターンを参照()できます。\NUMBER特に心の中に浮かぶのは次のとおりです。

sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g' 

内容は次のとおりです。

  • 0個以上の0個の文字と一致します。
  • 次の 1 つ以上のゼロ以外の文字を結合します。
  • 次に、スラッシュの後にゼロ文字以上のゼロ文字が続くことを見つけます。
  • 次の 1 つ以上のゼロ以外の文字を結合します。

実際、これは可変数のゼロにも当てはまります。

$ echo "at 12:27 AM on 11/08/2017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                                         
at 12:27 AM on 11/8/2017
$ echo "at 12:27 AM on 00000011/000008/00002017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                           
at 12:27 AM on 11/8/00002017
$ echo "at 12:27 AM on 011/08/00002017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                                    
at 12:27 AM on 11/8/00002017
$ echo "at 12:27 AM on 000000011/0000008/00002017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                         
at 12:27 AM on 11/8/00002017

必要に応じて、年の部分の内容を維持するのに十分です。この問題を排除するには、3番目のグループを追加することもできます。

$ echo "at 12:27 AM on 005/0025/0002017" | sed -r 's/0*([^0]+)\/0*([^0]+)\/0*([^0]+)/\1\/\2\/\3/g'                                                    
at 12:27 AM on 5/25/2017

これは他のキャラクターにも当てはまります(必須ではありませんが、お勧めします)。

$ echo "at 12:27 AM on 0November/00Fifth/2017" | sed -r 's/0*([^0]+)\/0*([^0]+)/\1\/\2/g'                                                             
at 12:27 AM on November/Fifth/2017

答え2

sed -e 's/\<00*\([1-9]\)/\1/g' input_data

動作:この正規表現は、左側がゼロで構成される文字列であり、そのゼロは単語区切り文字で区切られた整数[0-9]を探します\<

答え3

sed -ie 's/\/0?\//\/?\//g' ~/tmp

まず、スラッシュ以外の文字を区切り文字として使用できるため、s///エスケープなしでスラッシュを使用できます。第二に、もし @ステファン-ie拡張子はバックアップファイルとして扱われるため、e拡張子tmpeを変更(または削除)して、次のように書き換えます。

sed -i.bak -e 's,/0?/,/?/,g' ~/tmp

これで、一致する実際のパターン(文字列///0/リテラル文字列)を簡単に確認できます。 (EREでは、前のグループのコピーが0個または1個一致するため、0個または1個が一致します。)/0?//?/?0

疑問符は置換にとって特別なものではないので、文字通り表示されます。他の回答で述べたように、グループ化((...)EREまたは\(...\)BREを使用)を使用してパターンの一部をキャプチャしてから、もう一度\1交換する必要があります。

だからこんな感じ:

sed -i.bak -Ee 's,/0*([1-9]),/\1,g' ~/tmp

しかし、まだ前にスラッシュが必要なので、最初のゼロは05/08/2017置き換えられません。

ラケシュの使用\<すべての単語から先行ゼロを削除したい場合は、これは賢明なアクションかもしれません。その後、もう一度変更すると、それは望む12:03:04もの12:3:4ではないかもしれません。


最後の例は、05/08/2017 01:03:56 AM次のように変更されたコマンドを使用して実行できます。at 1:03 AM on 5/8sed

$ echo '05/08/2017 01:03:56 AM' | 
  sed -Ee 's,0*([0-9]+)/0*([0-9]+)/[0-9]+ 0*([0-9]+):([0-9]+):[0-9]+ ([AP]M),at \3:\4 \5 on \1/\2,'
at 1:03 AM on 5/8

あなたが受け入れたい他の入力形式が何であるかはわかりません。

答え4

代替テキストには正規表現を使用できません。はい、意味

sed 's/0\([0-9]\)/\1/'

関連情報