Я хочу удалить строки управления Return и merge в одном текстовом файле и ограничить количество символов
input.txt, содержащих:
comment 1
comment 2
...
comment n
input.txt [ ! d2] должна быть одна строка:
comment 1 comment 2 ... commnet n
НО, ouput.txt должно быть ограничено, например, 32 символами:
comment 1 comment 2 comment 3 co
Могу ли я использовать sed, awk tr или somthing еще?
head -c 32 input.txt | tr '\n' ' ' > output.txt
head -c 32 отбрасывает все кроме первых 32 байт. tr '\n' ' ' заменяет все символы новой строки с пробелами. если вы хотите, чтобы ограничить символы, а не байты в случае многобайтовых кодировок можно использовать вместо grep:
tr '\n' ' ' < input.txt | grep -oEe '^.{,32}' > output.txt
tr '\n' ' ' < in.txt | cut -c -32
tr '\n' ' ': удалить новые строки из входного текста cut -c -32: ограничить вывод до 32 символов Awk будет в порядке. Один из способов:
$ echo -n "comment 1\rcomment 2\r...\rcomment n\r" > input.txt
$ cat input.txt | awk -v FS="" -v RS="" '{for (i=1;i<=32;i++) printf ($i == "\r")? "" : $i}' > output.txt
$ cat output.txt
comment 1comment 2...comment
Объяснение: по умолчанию awk обрабатывает ввод строки за строкой, с одной строкой, называемой записью; каждая строка обрабатывается по столбцу, с одним столбцом, называемым полем. Каждое поле относится к переменным, начинающемуся с 1, например. $ 1, $ 2, $ 3 ...
Таким образом, вы меняете поведение по умолчанию, устанавливая полевой разделитель на "", заставляя awk обрабатывать материал по символу. Затем вы установите Сепаратор записи на "", чтобы вы могли сразу ссылаться на символы всего текста record .
Наконец, вы можете легко работать с символами, поэтому вы переходите через поля (т. е. символы) и печатать только тогда, когда символ не является возвратом каретки.
head -c 32 input.txt | tr '\n' ' ' > output.txt
head -c 32 отбрасывает все, кроме первых 32 байтов. tr '\n' ' ' заменяет все символы новой строки пробелами. Если вы хотите ограничить символы вместо байтов в случае многобайтовых кодировок символов, вы можете использовать grep вместо:
tr '\n' ' ' < input.txt | grep -oEe '^.{,32}' > output.txt
tr '\n' ' ' < in.txt | cut -c -32
tr '\n' ' ': удалить новые строки из входного текста cut -c -32: ограничить вывод до 32 символов Awk будет в порядке. Один из способов:
$ echo -n "comment 1\rcomment 2\r...\rcomment n\r" > input.txt
$ cat input.txt | awk -v FS="" -v RS="" '{for (i=1;i<=32;i++) printf ($i == "\r")? "" : $i}' > output.txt
$ cat output.txt
comment 1comment 2...comment
Объяснение: по умолчанию awk обрабатывает ввод строки за строкой, с одной строкой, называемой записью; каждая строка обрабатывается по столбцу, с одним столбцом, называемым полем. Каждое поле относится к переменным, начинающемуся с 1, например. $ 1, $ 2, $ 3 ...
Таким образом, вы меняете поведение по умолчанию, устанавливая полевой разделитель на "", заставляя awk обрабатывать материал по символу. Затем вы установите Сепаратор записи на "", чтобы вы могли сразу ссылаться на символы всего текста record .
Наконец, вы можете легко работать с символами, поэтому вы переходите через поля (т. е. символы) и печатать только тогда, когда символ не является возвратом каретки.