将行的最后一个字符移动到特定列 - sed? AWK?

时间:2013-07-04 16:38:17

标签: perl sed awk

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

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

但无法理解如何用可变数量的空格替换这样的&amp;转到第80栏。 谢谢!

4 个答案:

答案 0 :(得分:2)

使用/e开关s///告诉Perl e 评估替换部分以计算结果。

#! /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-ampersands
foo                                                                            &
                                                                               &
bar                                                                            &
baz

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

答案 1 :(得分:1)

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

awk '/&$/ {for(i=1;i<=NF;i++) $i=(i==80)?"& "$i:$i}1' yourFile

答案 2 :(得分: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;

Awk和Perl都提供substr命令。

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

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

答案 3 :(得分:0)

awk '/&$/{$80="&"}1' file