5

入力データがあります:

foo 24
foobar 5 bar
bar foo 125

出力したい:

foo 024
foobar 005 bar
bar foo 125

したがって、この sed 置換を使用できます。

s,\([a-z ]\+\)\([0-9]\)\([a-z ]*\),\100\2\3,
s,\([a-z ]\+\)\([0-9][0-9]\)\([a-z ]*\),\10\2\3,

しかし、私は同じことをする1つの置換を行うことができますか? 何かのようなもの:

if (one digit) then two leading 0
elif (two digits) then one leading 0

よろしく。

4

6 に答える 6

7

「if - else」ロジックを、中間データ (たとえば、一致の長さ) を保存せずに1 つの置換コマンドに組み込むことができるとは思えません。といっても、簡単にできないわけではありません。例えば:

$ N=5
$ sed -r ":r;s/\b[0-9]{1,$(($N-1))}\b/0&/g;tr" infile
foo 00024
foobar 00005 bar
bar foo 00125

再帰を使用して、ループ内の数字よりも短いすべての数字にゼロを 1 つ追加します$N。このループは、それ以上置換を行うことができなくなったときに終了します。ラベルは基本的に次のrように述べていますgoto r。フロー制御の詳細については、sed こちらを参照してください。

于 2012-08-26T10:56:39.270 に答える
1

2 つの代替コマンドを使用します。最初のコマンドは 1 桁を検索して直前に 2 つのゼロを挿入し、2 つ目のコマンドは 2 桁の数字を検索して直前にゼロを 1 つ挿入します。GNU sed単語境界コマンドを使用して数字 ( ) を検索するため、必要です\b

sed -e 's/\b[0-9]\b/00&/g; s/\b[0-9]\{2\}\b/0&/g' infile

編集してテストを追加します。

の内容infile:

foo 24 9
foo 645 bar 5 bar
bar foo 125

次の出力で前のコマンドを実行します。

foo 024 009
foo 645 bar 005 bar
bar foo 125
于 2012-08-26T10:45:21.377 に答える
1

sedオプションがカバーされているようです。次の方法がありますawk

BEGIN      { RS="[ \n]"; ORS=OFS=""   }
/^[0-9]+$/ { $0 = sprintf("%03d", $0) } 
           { print $0, RT             }
于 2012-08-26T12:25:56.690 に答える
0

これはあなたのために働くかもしれません(GNU sed):

echo '1.23 12,345 1 12 123 1234 1' | 
sed 's/\(^\|\s\)\([0-9]\(\s\|$\)\)/\100\2/g;s/\(^\|\s\)\([0-9][0-9]\(\s\|$\)\)/\10\2/g' 
1.23 12,345 001 012 123 1234 001

またはおそらく目には少し簡単です:

sed -r 's/(^|\s)([0-9](\s|$))/\100\2/g;s/(^|\s)([0-9][0-9](\s|$))/\10\2/g'
于 2012-08-26T13:36:32.880 に答える