0

この質問は、awk を使用した文字列パターン マッチングから発生しました。基本的には、正規表現パターンに基づいてテキスト行を複数のグループに分割し、2 つのグループのみを出力しています。問題は、印刷中にグループを右揃えできるsedかどうかです。以下は例です

$cat input.txt
it is line one
it is longggggggg one
itttttttttt is another one

$sed -e 's/\(.*\) \(.*\) \(.*\) \(.*\)/\1 \3/g' input.txt

グループ1と3を分割して出力しますが、出力は

it line
it longggggggg
itttttttttt another

私の質問はsed、出力が次のようになるようにそれを実行できるかということです

it                             line
it                      longggggggg
itttttttttt                 another

でやったのですawkが、 でできると思いますsedが、2番目のグループの長さを取得してから、グループ間に正しい数のスペースを埋め込む方法を取得できません。どんな提案も受け付けています試してみる。

4

6 に答える 6

2

これはうまくいくかもしれません(GNU sed):

sed -r 's/^(.*) .* (.*) .*$/\1 \2/;:a;s/^.{1,40}$/ &/;ta;s/^( *)(\S*)/\2\1/' file

また:

sed -r 's/^(.*) .* (.*) .*$/printf "%-20s%20s" \1 \2/e' file
于 2013-11-03T11:51:37.023 に答える
1

sed でループを使用して、目的を達成できます。

#!/bin/bash
echo 'aa bb cc dd
11 22 33333333 44
ONE TWO THREEEEEEEEE FOUR' | \
sed -e 's/\(.*\) \(.*\) \(.*\) \(.*\)/\1 \3/g' \
-e '/\([^ ]*\) \([^ ]*\)/ { :x ; s/^\(.\{1,19\}\) \(.\{1,19\}\)$/\1  \2/g ; tx }'

2 つの 19 は、列の幅を制御します。は、前の置換が成功するたび:xに によってループされるラベルです。( 「デバッグ」するために before tx をtx追加できます。p;

于 2013-11-03T09:19:31.740 に答える
0
TemplateSpace="                                                      "
TemplateSize=${#TemplateSpace}

sed "
# split your group (based on word here but depend on your real need)
s/^ *\(\w\) \(\w\) \(\w\) \(\w\).*$/\1 \3/

# align
s/$/${TemplateSpace}/
s/^\(.\{${TemplateSize}\}\).*$/\1/
s/\(\w\) \(\w\)\( *\)/\1 \3\2/
"

または TemplateSize を回避するためのより単純な (およびコンテンツにドットはありません)

TemplateSpace="............................................................."

そして交換

s/^\(.\{${TemplateSize}\}.*$/\1/ 

s/^\(${TemplateSpace}\).*$/\1/
s/\./ /g
于 2013-11-03T09:56:57.970 に答える
0

この場合、最も使いやすいawk...

bash ループを使用してスペースの数を計算し、対象の行で次のコマンドを実行することもできます。

while read; do
    # ... calculate $SPACE ...
    echo $REPLY|sed "s/\([^\ ]*\)\ *[^\ ]*\ *\([^\ ]*\)/\1$SPACES\2/g"
done < file

しかし、私awkはそれをすべて行うために使用することを好みます (または、Perl、Python、PHP シェルモードなどの他の高度なシェル言語...)

于 2013-11-03T08:51:57.263 に答える