2011-03-19 71 views
0

我在bash(或perl)上比較喜歡noob。尋找一種方法來修改某些線在一個文件中,(基本上除去每一行的前兩個字符,並添加一個「」在每行的末端)對文件的文本處理

###element 
##.element 
###test-element-00 

變爲下面,

#element, 
.element, 
#test-element-00, 

感謝

回答

2

在bash,那麼你正在尋找的是sed命令,嘗試:

cat filename | sed 's/^..\(.*\)$/\1,/' 
+1

+1提醒我sed中的分組工作方式(我們今天使用哪種標準正則表達式語法?),-0.5用於無用貓(1),+ 0.5因爲corgis是偉大的狗。 – 2011-03-19 05:03:45

+1

-1 for useless cat。 – kurumi 2011-03-19 05:07:52

1

的一點簡單的sed(1)是所有你需要爲:

sed 's/^..//' < your_file | sed 's/$/,/' 

或者你可以使用Perl如果你真的想:

perl -pe 's/^..(.*)/$1,/' < your_file 

或者你甚至可以切做(1),xargs的(1),和printf(1):

cut -c2- < your_file | xargs printf '%s,\n' 

我們很可能整晚都在這裏隨着shell工具的巧妙組合來實現所需的轉換,我可能只需要使用perl,然後轉向更高效的工作。

sed方法可能可以做得更好,但我的sed是生鏽的。

0

嘗試是這樣的:

my @old_lines = qw(###element ##.element ###test-element-00); 
my @new_lines; 
for my $line (@old_lines) { 
    $line =~ s/^##//; 
    $line .= ','; 
    push @new_lines, $line; 
} 

print "@new_lines"; 
0

AWK

$> awk '/^#/ { print substr($0,3)"," }' file 
#element, 
.element, 
#test-element-00, 

紅寶石(1.9+)

$> ruby -ne 'print "#{$_.chomp[2..-1]},\n" if /^#/' file 
#element, 
.element, 
#test-element-00, 

或者只是純粹的bash

$> while read -r line; do echo "${line:2},"; done < file 
#element, 
.element, 
#test-element-00, 

或者如果你喜歡的sed

$> sed 's/^..//;s/$/,/' file 
#element, 
.element, 
#test-element-00, 
0

有這樣做的幾種方法,這樣做的一個方式在perl是:

$line = '##element' 
$line = substr ($line, 2) . ','; 
0

行,只適用於多種:

yes , | head -n $(wc -l < filename) | paste -d '' <(cut -c3- filename) - 

yes , | head -n $(wc -l < filename) | paste -d '' <(grep -Po '..\K.*' filename) - 

需要一個外殼,諸如擊,支持進程替換。對於grep版本,需要支持Perl Compatible Regular Expressions。

5
perl -ple's/..(.*)/$1,/' infile > outfile 

perl -ple's/..//;s/$/,/' infile > outfile 

使用就地編輯:

perl -i -ple's/..(.*)/$1,/' file 

perl -i -ple's/..//;s/$/,/' file 
0

這裏還有一條辦法做到這一點使用ed命令:

str=' 
###element 
##.element 
###test-element-00 
' 

# for in-place file editing use "ed -s file" and replace ",p" with "w" 
# cf. http://wiki.bash-hackers.org/howto/edit-ed 
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s <(echo "$str") 
    H 
    ,g/.\{2\}/s/^..\(.*\)$/\1,/ 
    ,p 
    q 
EOF 
0

Bash可以處理這只是罰款:line="##element"; echo "${line#??},"