我需要替換所有以特定字符結尾的行(比如說,&),使得這個字符應該位於特定列(比如80)。 哪個工具最好? 我已經開始思考的sed:將行的最後一個字符移至特定列 - sed? AWK?
sed 's/\(.*\)&/\1 <what should be here??> &/'
,但不能瞭解如何與不同數量的空間,使得&去柱80 由於更換!
我需要替換所有以特定字符結尾的行(比如說,&),使得這個字符應該位於特定列(比如80)。 哪個工具最好? 我已經開始思考的sed:將行的最後一個字符移至特定列 - sed? AWK?
sed 's/\(.*\)&/\1 <what should be here??> &/'
,但不能瞭解如何與不同數量的空間,使得&去柱80 由於更換!
使用/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
如果輸入包含製表符,你需要使用更復雜的處理。
不知道是否我正確地理解你的問題,但你可以嘗試這樣(假設你的文件空格分隔):
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
問題是不明確的。短於80的線會發生什麼?填滿空格?長度超過80的線會發生什麼情況?第80個字符是用'&'替換還是用'&'拼接到位置? – daxim