特定の文字列の後に続く文字間の間隔を調整するには?

特定の文字列の後に続く文字間の間隔を調整するには?

大きなファイルがあります~/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>YXとYの間のスペースを2つのスペースに置き換えます。

答え2

そしてsed

sed -i 's/\([0-9]\)\s\+\([0-9]\)/\1  \2/' file
  • -iファイルを適切に編集します。
  • [0-9]:番号を検索します。
  • \s+:数字の後にスペースやタブ文字が続きます。
  • [0-9]: 、その後に数字が続きます。
  • \1 \22つの数字は逆参照に保存され、\12\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

関連情報