0

如果开头是给定的字符串,我正在尝试替换一行中的某些位置。这是输入文件的示例:

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

如果"TOTAL"在 line 的 biginning 处找到,我想用空格替换 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

如果您可以拥有TOTALSUMA_,只需使用:

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

使用

perl -pe 's/TOTAL.{20}(.*)/sprintf "%s%s%s", "TOTAL", " "x20, $1/e' file.txt
于 2013-02-25T15:19:10.047 回答
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 回答
1

有趣的是,答案使用sed, awkperl但没有使用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 回答