Удалить\n символов из диапазона строк в текстовом файле

Скажем, у нас есть текстовый файл с 1000 строк.

Как мы можем удалить новые строковые символы из строки 20 на 500 (замените их, например, пробелом)?

Моя попытка:

sed '20,500p; N; s/\n/ /;' #better not to say anything

Все остальные строки (1-19 & 501-1000) должны быть сохранены как есть.

Как я знаком с sed, awk или perl-решениями приветствуются, но, пожалуйста, дайте им объяснение, поскольку я новичок perl и awk.

Ответ 1

Использование однострочного perl для прокладки новой строки:

perl -i -pe 'chomp if 20..500' file

Или заменить его пробелом:

perl -i -pe 's/\R/ / if 20..500' file

Объяснение:

Переключатели:

  • -i: отредактируйте файлы <> (делает резервную копию, если добавлено расширение)
  • -p: Создает цикл while(<>){...; print} для каждой "строки" в вашем входном файле.
  • -e: Сообщает perl выполнить код в командной строке.

Код

Ответ 2

Вы можете использовать что-то вроде этого (мой пример немного в меньшем масштабе: -)

$ cat file
1
2
3
4
5
6
7
8
9
10
$ awk '{printf "%s%s", $0, (2<=NR&&NR<=5?FS:RS)}' file
1
2 3 4 5 6
7
8
9
10

Второй %s в спецификаторе формата printf заменяется либо разделителем полей (пробел по умолчанию), либо разделителем записи (символом новой строки) в зависимости от того, находится ли номер записи в пределах диапазона.

В качестве альтернативы:

$ awk '{ORS=(2<=NR&&NR<=5?FS:RS)}1' file
1
2 3 4 5 6
7
8
9
10

Измените разделитель выходной записи в зависимости от номера строки и распечатайте каждую строку.

Вы можете передавать переменные для начала и конца, если хотите, используя awk -v start=2 -v end=5 '...'

Ответ 3

Это может сработать для вас (GNU sed):

sed -r '20,500{N;s/^(.*)(\n)/\2\1 /;D}' file

или, возможно, более читаемо:

sed ':a;20,500{N;s/\n/ /;ta}' file

Ответ 4

Здесь версия perl:

my $min = 5; my $max = 10;
while (<DATA>) {
    if ($. > $min && $. < $max) {
        chomp;
        $_ .= " ";
    }
    print;
}

__DATA__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Вывод:

1
2
3
4
5
6 7 8 9 10
11
12
13
14
15

Он читает в DATA (который вы можете установить как дескриптор файла или что-то, что требуется вашему приложению) и проверяет номер строки, $.. Пока номер строки находится между $min и $max, окончание строки chomp ed off и пробел, добавленный в конец строки; в противном случае строка печатается как есть.