Чтобы предотвратить перезапись существующих файлов при перенаправлении >
, используйте параметр noclobber
в bash
или любой POSIX -, например оболочку (, а также в (t)csh
, где функция фактически возникла, хотя вы set noclobber
вместо set -o noclobber
/set -C
там ). Затем, если вам нужно принудительно заменить файл, используйте оператор перенаправления >|
(>!
в (t)csh
).
Пример:
$ echo abc > file
$ set -o noclobber
$ echo xyz > file
bash: file: cannot overwrite existing file
$ echo xyz >| file
$ cat file
xyz
Кстати, текущие настройки можно проверить с помощью set -o
:
$ set -o
...
monitor on
noclobber on
noexec off
...
Таким образом, вы хотите соединить строки, не начинающиеся с File_Name
, с предыдущей строкой?
В sed
вы используете шаблон N;P;D
для такого рода задач:
sed 'N;/\nFile_Name/!s/\n/ /;P;D' abc.txt
N
добавляет следующую строку в пространство шаблонов /\nFile_Name/
обращается ко всем строкам с File_Name
после новой строки; !
инвертирует выделение, поэтому следующая команда выполняется только в том случае, если вторая строка из двух строк в пространстве шаблонов не начинается сFile_Name
s/\n/ /
заменяет новую строку между строками пробелом P
печатает первую строку в пространстве шаблонов D
удаляет все до новой строки и начинает новый цикл со второй строкой, все еще находящейся в пространстве шаблона (к следующей строке добавляется новая пара строк)Обратите внимание, что это работает только для соединения двух строк. Если строки можно разбить на несколько строк, нам нужно добавить цикл или сделать это по-другому.
Вот еще одна версия с использованием perl
, которая удалит несколько новых строк из текста:
perl -pe 's/\n//' abc.txt | perl -pe 's/(.)File_Name/\1\nFile_Name/g'
Он сначала удаляет все новые строки из текста, а затем вставляет новые перед каждым вхождением «Имя файла _», когда ему предшествует хотя бы один символ.
Вы можете передать его дальше, если вам нужно очистить, например. несколько пробелов:
perl -pe 's/\n/ /' abc.txt \
| perl -pe 's/(.)File_Name/\1\nFile_Name/g' \
| perl -pe 's/ +/ /g'
Если по какой-то причине версия -pe не работает, то вот отдельная perl
программа :stripper.pm Это стандартный способ сделать что-то на основе того, что в предыдущей строке Это. Вы бы запустили его через
perl stripper.pm <abc.txt >new_abc.txt
#!/usr/bin/perl
my $previous = <STDIN>;
if( defined $previous ){
chomp $previous;
};
while( $line = <STDIN> ){
chomp $line;
unless( $line =~ m/^File_Name/ ){
$previous.= $line;
} else {
print STDOUT "$previous\n";
$previous = $line;
}
}
print STDOUT "$previous\n";