2

我需要替换所有以特定字符(例如&)结尾的行,以便该字符应位于某个列(例如 80)中。哪个工具最好?我已经开始考虑 sed:

sed 's/\(.*\)&/\1 <what should be here??> &/'

但无法理解如何用可变数量的空格替换,以便 & 转到第 80 列。谢谢!

4

4 回答 4

2

使用/eswitch tos///告诉 Perl评估替换部分以计算结果。

#! /usr/bin/env perl

use strict;
use warnings;

while (<>) {
  s/^(.*)(&)$/$1 . " " x (79 - length $1) . $2/e;
  print;
}

样品运行:

$ echo -e 'foo&\n&\nbar &\nbaz' | ./align-& 符号
富 &
                                                                               &
酒吧 &
巴兹

如果您的输入包含 TAB 字符,您将需要使用更复杂的处理。

于 2013-07-04T16:45:09.913 回答
1

不确定我是否正确理解了您的问题,但您可以尝试类似(假设您的文件是空格分隔的):

awk '/&$/ {for(i=1;i<=NF;i++) $i=(i==80)?"& "$i:$i}1' yourFile
于 2013-07-04T16:54:53.360 回答
0

awk 和 Perl 都可以工作。两者都有printfsubstr

#! /usr/bin/env perl
use warnings;
use strict;

my $string = "this is some text &";

my $last_char = substr($string, -1, 1);
$string =  substr ($string, 0, length ($string ) - 1);
printf qq(%-79.79s%s\n), $string, $last_char;

substr命令在 Awk 和 Perl 中都可用。

整个命令可以做成一个单行:

printf qq(%-79.79s%s\n), substr ($string, 0, length ($string ) - 1), substr($string, -1, 1);
于 2013-07-04T17:18:24.243 回答
0
awk '/&$/{$80="&"}1' file
于 2013-07-04T18:03:25.097 回答