大きなファイルがあります~/foo.txt
。数千行のテーブル
SIZE : X Y
ファイル全体に分散されており、 sum は整数X
です。Y
私の問題は、時には整数が2つのスペースに分かれ、時には1つのスペースに分けられることX
ですY
。間隔を一貫して作成するためにPerlスクリプトを作成したいと思います。可能であれば、2つのスペースを使用することをお勧めします。どうすればいいですか?
答え1
整数だと言ったけど、正数を意味しているようだ。試すことができるおおよそのクイック回避策は次のとおりです。
sed 's/\([0-9]\+\)\s\+\([0-9]\+\)/\1 \2/g'
これには、2番目の数字がマイナス記号で始まる場合や空白がある場合など、いくつかの注意事項があります。いいえa53
たとえば、次のような間に発生する状況を処理したいと思います27B
。または望まない場合みんな数字は2つのスペースで区切られます。しかし、これはあなたが望むように修正することができる開始です。
質問をもう一度読んでみると、「圧縮」したいすべてのスペースが「SIZE」という単語で始まる行に特に現れるようです。これにより、状況がはるかに簡単になります。 「連続した空白の他のインスタンス」を保存したいと言われましたが、これが別の行にあるように聞こえます。したがって、この場合は以下を使用してください。
sed '/^SIZE/ s_\s\s\+_ _'
(代替テキストには2つのスペースがあります。)
もう一度読んでみると、今修正したい気がします。一つスペースは2つのスペースになります。これはその行の特定の形式によって異なりますが、次のように言いたいと思います。
sed '/^SIZE/ s_\s\+_ _3'
それは行わなければなりません。 (提供された例では機能します。)これ3
を行うと、次の場合にのみ置換が発生します。3番目の場所マッチ\s\+
- Chaosが説明したように、これは「1つ以上のスペースまたはタブ」を意味します。したがって、SIZE<space>:<space>X<space>Y
XとYの間のスペースを2つのスペースに置き換えます。
答え2
そしてsed
:
sed -i 's/\([0-9]\)\s\+\([0-9]\)/\1 \2/' file
-i
ファイルを適切に編集します。[0-9]
:番号を検索します。\s+
:数字の後にスペースやタブ文字が続きます。[0-9]
: 、その後に数字が続きます。\1 \2
2つの数字は逆参照に保存され、\1
2\2
つのスペースに分けられます。
例:
$ cat file
SIZE : 2 1 # 2 spaces
SIZE : 1 22 # 1 space
SIZE : 1 1 # 4 spaces
SIZE : 324 34 # a tab
SIZE : 324 34 # 2 tabs
$ sed 's/\([0-9]\)\s\+\([0-9]\)/\1 \2/' file
SIZE : 2 1
SIZE : 1 22
SIZE : 1 1
SIZE : 324 3
SIZE : 324 34
答え3
sed 's/\([0-9] \) *\([-+.]*[0-9]\)/\1 \2/g' <in >out