удалить новую строку из середины строки, используя начальную текстовую строку

Чтобы предотвратить перезапись существующих файлов при перенаправлении >, используйте параметр 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
...
0
30.04.2019, 01:05
3 ответа

Таким образом, вы хотите соединить строки, не начинающиеся с 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удаляет все до новой строки и начинает новый цикл со второй строкой, все еще находящейся в пространстве шаблона (к следующей строке добавляется новая пара строк)

Обратите внимание, что это работает только для соединения двух строк. Если строки можно разбить на несколько строк, нам нужно добавить цикл или сделать это по-другому.

1
28.01.2020, 02:40

Вот еще одна версия с использованием 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'
0
28.01.2020, 02:40

Если по какой-то причине версия -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";
0
28.01.2020, 02:40

Теги

Похожие вопросы