Обрабатывая текст, мне нужно удалять символ новой строки каждые две строки.
Образец текста:
this is line one
and this is line two
the third and the
fourth must be pasted too
Желаемый вывод:
this is line one and this is line two
the third and the fourth must be pasted too
Я пробовал while
цикл, но цикл while - плохая практика. Можно ли сделать это с помощью tr
или любой другой командой?
text-processing
jomaweb
источник
источник
Ответы:
paste
(также стандартная простая утилита POSIXtr
) - ваш инструмент для этого.Предполагая, что вы хотите, чтобы эти символы новой строки были заменены пробелом, а не просто удалены, как в вашем примере:
Или:
Замените
' '
на,'\0'
если вы действительно хотите, чтобы они были удалены.Чтобы заменить 2 из 3:
1 из 3, начиная со второго:
И так далее.
Еще одна хорошая вещь
paste
- это то, что она не оставит строку без завершения. Например, если вы удаляете каждую новую строку в файле (как с помощьюtr -d '\n' < file
илиtr '\n' ' ' < file
), вы в итоге не получаете никакой строки, поскольку строки должны заканчиваться символом новой строки. Поэтому, как правило, лучше использоватьpaste
вместо этого (как вpaste -sd '\0' file
илиpaste -sd ' ' file
), который добавит завершающий символ новой строки, необходимый для правильного текста.источник
С современным GNU SED
И awk
источник
sed
подход подразумевает удаление всего файла в памяти (при условии, что он не содержит байтов NUL) и выполнение дорогостоящей замены регулярных выражений. Я не вижу преимущества по сравнению со стандартнымsed 'N;s/\n/ /'
подходом.Используйте
sed
для этого, как показано ниже:источник
Другой способ заключается в использовании
xargs
:где
Хотя это решение является чрезмерным, потому что
echo
процесс выполняется для каждой строки ... Таким образом, помимо примеров игрушек, решение на основе awk / sed или аналогичного должно быть предпочтительным.источник
echo
реализации у вас также могут возникнуть проблемы с символами обратной косой черты или некоторыми строками, начинающимися с-
(например,--help
или-nene
с GNUecho
). Также обратите внимание, что-d
это расширение GNU.echo
, вы можете использовать это:< txt xargs -d '\n' -n 2 printf -- '%s %s\n'
На самом деле это очень просто в vim. Чтобы присоединиться к каждой строке, используйте
J
команду, затем используйте%norm
команду, чтобы применить ее к каждой строке одновременно. Например(На тот случай, если вы не знакомы с vim,
<CR>
просто означает войти)Это даже работает, чтобы соединить произвольное количество строк. Например, присоединиться каждые десять строк будет
Если вас не устраивает vim, и вы предпочитаете использовать его в качестве инструмента командной строки, а не интерактивного текстового редактора, вы можете сделать следующее:
источник
Это выводит на печать каждую строку,
$0
сопровождаемую либо пробелом, либо переводом строки в зависимости от того, является ли номер строкиNR
нечетным или четным.Выражение
NR%2?" ":"\n"
является троичным утверждением. ВыражениеNR%2
оценивается как истинное (ненулевое), если номер строки нечетный. В этом случае троичное выражение возвращает пробел. Если оно оценивается как ложное (ноль), тогда возвращается символ новой строки.альтернатива
Как предложено Костасом в комментариях:
Здесь троичный оператор
NR%2?" ":RS
используется для возврата пробела или разделителя входных записей (поRS
умолчанию = новая строка). Это значение присваивается разделителю выходной записиORS
. В1
конце команды - загадочное сокращение awk для print-the-record.источник
()
круглые скобки и пробел послеprintf
;)'NR%2{printf("%s ",$0);next}1'
'{ORS=(NR%2?" ":RS)}1'
ORS
решением.Типовое решение, замените
5
на необходимое количество строкисточник
Вы можете использовать
awk
для этого:Это производит:
где:
Эти
awk
действия выполняются для каждой строки, специальные переменные$0
ссылки на текущую строку,NR
это номер текущей строки (начиная с 1). Второе действие защищается выражениемNR%2
, которое является операцией по модулю. Таким образом,c=" "
выполняется только в том случае, еслиNR%2
истина, т.е. для нечетных номеров строк.awk
Синтаксис C , как, но некоторые элементы не являются обязательными в некоторых контекстах - например , точка с запятой.источник
c
переменнаяORS
:'NR%2{ORS=" "}1;{ORS=RS}'
Использование
ed
:В
ed
командах редактирования будет, для каждой строки (g
применяется набор команд редактирования для каждой строки , соответствующей заданного регулярного выражение), добавьте символ пробела до конца и присоединиться к нему со следующей строкой. Затем он записывает полученный текст в файл с именемtext.new
.источник
С рубином.
Я предполагаю, что каждый блок
n
строк должен быть объединен. Предположимn = 3
, входной файл'infile'
и результаты должны быть записаны в файл'outfile'
.Построить файл
Подтвердите содержимое файла
Удалить переводы строки и записать в файл
Подтвердите содержание
источник
ruby
это не по теме U & L. Но, так как вы используете его из командной строкиruby -e
, этого достаточно по теме.