Удалить\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
выполнить код в командной строке.
Код
-
chomp
: удалить новую строку
-
20 .. 500
: if Оператор диапазона ..
находится между номерами строк от 20 до 500
Ответ 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 и пробел, добавленный в конец строки; в противном случае строка печатается как есть.