Это уберет все конечные пробелы:
perl -e '$s = ""; while (defined($_ = getc)) { if (/\s/) { $s .= $_; } else { print $s, $_; $s = ""; } }' < infile > outfile
Вероятно, есть эквивалент в sed
, но я гораздо лучше знаком с Perl, надеюсь, он вам подходит.Основная идея: если следующим символом является пробел, сохраните его;в противном случае выведите любые сохраненные символы, за которыми следует только что прочитанный символ.Если мы нажмем EOF после прочтения одного или нескольких пробельных символов, они не будут напечатаны.
Это просто обнаружит конечные пробельные символы и даст код выхода 1, если так: [РЕДАКТИРОВАТЬ] Выше описано, как обнаружить или изменить один файл.Если у вас есть большое дерево каталогов, содержащее файлы, к которым вы хотите применить изменения, вы можете поместить команду в отдельный скрипт:
fix.pl
#!/usr/bin/perl
$s = "";
while (defined($_ = getc)) {
if (/\s/) { $s .= $_; } else { print $s, $_; $s = ""; }
}
и использовать его вв сочетании с командой find
:
find /top/dir -type f -exec sh -c 'mv "{}" "{}.bak" && fix.pl < "{}.bak" > "{}"' ';'
Это приведет к перемещению каждого исходного файла в файл резервной копии, заканчивающийся на «.bak».(Было бы неплохо сначала проверить это на небольшом тестовом наборе файлов.)