文件的文本操作

时间:2011-03-19 04:36:47

标签: perl bash

我很喜欢bash(或perl)。想办法修改文件中的某些行,(基本上删除每行的前2个字符,并在每行的末尾添加“,”)

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

成为以下内容,

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

由于

9 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

在bash上你正在寻找的命令是sed,试试:

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

答案 2 :(得分:1)

您只需要一点简单的sed(1):

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

如果你真的想要,你可以使用Perl:

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

或者您甚至可以使用cut(1),xargs(1)和printf(1)执行此操作:

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

我们可能整晚都会在这里使用聪明的shell工具组合来执行所需的转换,我可能只需要使用perl,然后继续使用更高效的东西。

sed方法可能会做得更好,但我的sed生锈了。

答案 3 :(得分: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";

答案 4 :(得分: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 's/^..//;s/$/,/' file
#element,
.element,
#test-element-00,

答案 5 :(得分:0)

有几种方法可以做到这一点,在perl中执行此操作的一种方法是:

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

答案 6 :(得分:0)

好的,只是为了变化:

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

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

需要支持进程替换的shell,例如Bash。对于grep版本,需要支持Perl兼容正则表达式。

答案 7 :(得分: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

答案 8 :(得分:0)

Bash可以处理这个问题:line="##element"; echo "${line#??},"