Текстовые манипуляции с файлом - PullRequest
0 голосов
/ 19 марта 2011

Я скорее noob на Bash (или Perl).Поиск способа изменения некоторых строк в файле (в основном удаление первых 2 символов каждой строки и добавление «,» в конце каждой строки)

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

становится следующим:

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

Спасибо

Ответы [ 9 ]

5 голосов
/ 19 марта 2011
perl -ple's/..(.*)/$1,/' infile > outfile

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

Использование редактирования на месте:

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

perl -i -ple's/..//;s/$/,/' file
2 голосов
/ 19 марта 2011

На bash вы ищете команду sed, попробуйте:

cat filename | sed 's/^..\(.*\)$/\1,/'
1 голос
/ 19 марта 2011

Немного простого 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'

Мы могли бы быть здесь всю ночь, придя с умными комбинациями инструментов оболочки, чтобы выполнить желаемое преобразование, я бы, вероятно, просто пошел с Perl и перешел к более продуктивным вещам.

Подход sed, вероятно, может быть лучше, но мой седь ржавый.

0 голосов
/ 12 апреля 2011

Bash может справиться с этим очень хорошо: line="##element"; echo "${line#??},"

0 голосов
/ 19 марта 2011

Вот еще один способ сделать это с помощью команды 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 голосов
/ 19 марта 2011

ОК, просто для разнообразия:

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

или

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

Требуется оболочка, такая как Bash, которая поддерживает подстановку процессов.Для версии grep требуется поддержка регулярных выражений, совместимых с Perl.

0 голосов
/ 19 марта 2011

Есть несколько способов сделать это, один из способов сделать это в Perl:

$line =  '##element'
$line = substr ( $line, 2 ) . ',';
0 голосов
/ 19 марта 2011

awk

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

Ruby (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 голосов
/ 19 марта 2011

Попробуйте что-то вроде этого:

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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...