我需要替换以特定字符结尾的所有行(例如&),以便此字符应位于某个列中(例如,80)。 哪种工具最好? 我开始考虑sed:
sed 's/\(.*\)&/\1 <what should be here??> &/'
但无法理解如何用可变数量的空格替换这样的&amp;转到第80栏。 谢谢!
答案 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都会工作。两者都有printf
和substr
:
#! /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