我需要替换所有以特定字符(例如&)结尾的行,以便该字符应位于某个列(例如 80)中。哪个工具最好?我已经开始考虑 sed:
sed 's/\(.*\)&/\1 <what should be here??> &/'
但无法理解如何用可变数量的空格替换,以便 & 转到第 80 列。谢谢!
使用/e
switch 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 字符,您将需要使用更复杂的处理。
不确定我是否正确理解了您的问题,但您可以尝试类似(假设您的文件是空格分隔的):
awk '/&$/ {for(i=1;i<=NF;i++) $i=(i==80)?"& "$i:$i}1' yourFile
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;
该substr
命令在 Awk 和 Perl 中都可用。
整个命令可以做成一个单行:
printf qq(%-79.79s%s\n), substr ($string, 0, length ($string ) - 1), substr($string, -1, 1);
awk '/&$/{$80="&"}1' file