0

先頭が特定の文字列の場合、行の特定の位置を置き換えようとしています。入力ファイルの例を次に示します。

...
line1 with details 100 2566 1222
line2 with details 258 5874 5455
TOTAL text here    425 9589 8984

が行頭にある場合"TOTAL"は、20 から 27 の位置をスペースで置き換えたいと思います。

...
line1 with details 100 2566 1222
line2 with details 258 5874 5455
TOTAL text here             8984

それを行う方法についてのアイデアはありますか?

4

5 に答える 5

4

使用sed

sed 's/\(TOTAL.\{14\}\).\{8\}\(.*\)/\1        \2/' <file>

このソリューションは、最初の19文字をキャプチャし、次の8文字をスキップして、残りの行をキャプチャします。

$ sed 's/\(TOTAL.\{14\}\).\{8\}\(.*\)/\1        \2/' <<EOF
...
line1 with details 100 2566 1222
line2 with details 258 5874 5455
TOTAL text here    425 9589 8984
EOF

...
line1 with details 100 2566 1222
line2 with details 258 5874 5455
TOTAL text here             8984

TOTALまたはを使用できる場合は、次SUMA_を使用してください。

sed 's/\(\(TOTAL\|SUMA_\).\{14\}\).\{8\}\(.*\)/\1        \3/' <file>
于 2013-02-25T15:12:03.217 に答える
2

perl

perl -pe 's/TOTAL.{20}(.*)/sprintf "%s%s%s", "TOTAL", " "x20, $1/e' file.txt
于 2013-02-25T15:19:10.047 に答える
1

興味深いことに、 、 を使用して回答しますsedが、 を使用するものawkはありperlませんbash。だから、ここに行きます:

while read line
do
    if [[ $line == TOTAL* ]];then
        extract=${line:19:8}
        echo "${line/$extract/        }"
    else
        echo "$line"
    fi

done << END
line1 with details 100 2566 1222
line2 with details 258 5874 5455
TOTAL text here    425 9589 8984
END

これは完全ではありません。同じ行で番号が重複している場合、問題が発生します。

于 2013-02-25T17:00:17.443 に答える
1

これにはperlを使用すると思います:

perl -pe 'substr($_,20,8," "x8 ) if /TOTAL/' input-file

しかし、あなたが本当に欲しいのは次のようなものだと思います:

awk '/TOTAL/{ $2=""; $3="" } 1 ' input-file

ただし、フォーマットを同じに保つ必要がある場合は、次のことができます。

awk '/TOTAL/{ printf( "%s%30s\n", $1, $4 ); next } 1' input-file

フォーマット文字列に適切なフィールド幅を指定します。

于 2013-02-25T15:18:13.787 に答える
1

awk

awk '/^TOTAL/{$0= substr($0, 1, 19)"        "substr($0,28, length($0))}1' file

または、すべての行の列数が同じ場合

awk '/^TOTAL/{$0=sprintf("%s%27s", $1, $6)}1' file
于 2013-02-25T15:25:38.200 に答える