Как найти и переместить текстовую строку внутри файла?

Мне нужно изменить положение текстовой строки внутри файла; от одной позиции линии до другой, под определенным текстом.

Например, у меня есть следующий текстовый блок (в файле /etc/pam.d/system-auth)

account required pam_unix.so account sufficient pam_localuser.so account required pam_permit.so account required pam_tally2.so 

И я хочу «переместить» последнюю строку на вторую строку (под той, которая содержит pam_unix.so)

Как это можно сделать, используя команду Perl?

4 Solutions collect form web for “Как найти и переместить текстовую строку внутри файла?”

Вы можете сделать это, используя модуль Tie::File который связывает строки файла с переменной массива:

 perl -MTie::File -e ' tie @lines,"Tie::File","your_file_here"; $last_line = pop @lines; splice @lines,1,0,$last_line ' 

@lines переменная ( @lines ) становится волшебной в том смысле, что любые операции массива, которые вы выполняете на ней, влияют на строки файла, к которому он привязан.

Вы можете сделать:

 perl -e '@l=<>;($l[1],$l[$#l])=($l[$#l],$l[1]);print @l' < file 1<> file 

(обратите внимание, что он перезаписывает файл на месте без защитной сетки).

С ex :

 ex -sc 'd|1 put|wq' file 

Используется это решение для решения моей проблемы …

 /bin/grep "pam_tally2.so" /etc/pam.d/system-auth if [ "$?" -eq "0" ]; then #looks for line existence (pam_tally2.so) and delete it (if present) /usr/bin/perl -i -pe 'chomp,$_.="" if /account\s.*required\s.*pam_tally2.so/' /etc/pam.d/system-auth /usr/bin/find /etc/pam.d/system-auth.bkp | /usr/bin/xargs perl -pi -e 's/account\s*required\s*pam_tally2.so//' #inserts the -deleted- line underneath pam_unix.so line, as desired. Creating a 'moving line' result. /usr/bin/perl -i -pe 'chomp,$_.="\n" if /account\s.*required\s.*pam_unix.so/' /etc/pam.d/system-auth /usr/bin/perl -i -pe 'chomp,$_.="\naccount required pam_tally2.so\n" if /account\s.*required\s.*pam_unix.so/' /etc/pam.d/system-auth fi 

Чтобы более точно ответить на вопрос:

 #!/usr/bin/perl use List::MoreUtils qw(firstidx lastidx); # you may have to install this from CPAN use autodie; use File::Copy; my $f = '/etc/pam.d/system-auth'; open my $fh, '<', $f; my @lines = <$fh>; close $fh; # find the first and last "auth" lines: my $first = firstidx {/^account\b/} @lines; my $last = lastidx {/^account\b/} @lines; # remove my $removed = splice @lines, $last, 1; # insert splice @lines, $first+1, 0, $removed; # backup first copy $f, "$f.bak"; open my $fh, '>', $f; print $fh join('', @lines); close $fh; 
  • Как перечислить все существующие оптические драйверы?
  • Как сделать URL из этого текста с наименьшими ресурсами?
  • Как сопоставить параметр и заменить значение после разделителя «=»
  • Поиск и замена Perl записывает каждый файл
  • символьная ссылка perl в файле gz
  • Поиск максимального значения в файле
  • Усечь третий столбец до тех пор, пока не будут указаны строки
  • Используйте AWK для разделения подстроки на последние n символов на новый столбец
  • Фиксация заголовка и печати
  • необязательный текст переменной длины grep
  • Как получить строки между строками?
  • Linux и Unix - лучшая ОС в мире.