2013-07-04 33 views
2

我需要替換所有以特定字符結尾的行(比如說,&),使得這個字符應該位於特定列(比如80)。 哪個工具最好? 我已經開始思考的sed:將行的最後一個字符移至特定列 - sed? AWK?

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

,但不能瞭解如何與不同數量的空間,使得&去柱80 由於更換!

+2

問題是不明確的。短於80的線會發生什麼?填滿空格?長度超過80的線會發生什麼情況?第80個字符是用'&'替換還是用'&'拼接到位置? – daxim

回答

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

如果輸入包含製表符,你需要使用更復雜的處理。

1

不知道是否我正確地理解你的問題,但你可以嘗試這樣(假設你的文件空格分隔):

awk '/&$/ {for(i=1;i<=NF;i++) $i=(i==80)?"& "$i:$i}1' yourFile 
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); 
0
awk '/&$/{$80="&"}1' file 
相關問題