У меня есть длинная строка, в которую я хочу вставить пробел через каждые 4 символа, в одну строку сплошного текста, чтобы его было легче читать, какой самый простой способ сделать это? также я должен быть в состоянии ввести строку из трубы. например
echo "foobarbazblargblurg" | <some command here>
дает
foob arba zbla rgbl urg
command-line
shell
text-processing
xenoterracide
источник
источник
sed
я попробовал первым, я мог ударить себя.'s/.\{4\}/& /g;s/ $//'
Вы можете использовать следующий простой пример:
источник
sed
ответ. Я не знал об этомfold
раньше.fold
он не работает с многобайтовыми символами (какecho €€€€€€€€ | fold -w4 | paste -sd' ' -
в UTF-8).Вот пример использования
grep
иxargs
:источник
xargs
запускаетсяecho
по умолчанию, поэтому он не будет работать с такими словами, как-nen
или содержащие обратную косую черту, в зависимости отecho
реализации. Вы также увидите странный символ новой строки время от времени, если xargs запускает более одногоecho
. Лучшеpaste -sd ' ' -
вместо трубы . Обратите внимание, что-o
это не стандартная опция.Только в bash, без внешних команд:
или в виде однолинейной трубы:
Это работает путем преобразования каждого символа строки в "(.)" Для сопоставления с регулярным выражением и захвата с помощью
=~
, а затем просто выведите захваченные выражения изBASH_REMATCH[]
массива, сгруппированного по мере необходимости Ведущие / конечные / промежуточные пробелы сохраняются, удаляйте кавычки вокруг"${BASH_REMATCH[@]:1}"
чтобы пропустить их.Здесь она заключена в функцию, она будет обрабатывать свои аргументы или читать stdin, если аргументов нет:
Вы можете легко параметризировать счетчик, чтобы соответствующим образом настроить строку формата.
Добавляется завершающий пробел, используйте два
printf
s вместо одного, если это проблема:Первый
printf
печатает (до) первых 4 символов, второй условно печатает все остальные (если они есть) с пробелом для разделения групп. Тест для 5 элементов, а не 4 для учета нулевого элемента.Заметки:
printf
«s%c
может быть использован вместо%s
,%c
(возможно) делает цель более ясной, но это не многобайтный символ безопасности. Если ваша версия bash способна, все вышеизложенное безопасно для многобайтовых символов.printf
использует свою строку формата до тех пор, пока у нее не закончатся аргументы, поэтому она просто поглощает 4 аргумента за раз и обрабатывает завершающие аргументы (поэтому не требуется крайних случаев, в отличие от некоторых других ответов, которые здесь могут быть ошибочными)BASH_REMATCH[0]
является всей совпавшей строкой, поэтому выводится только начиная с индекса 1printf -v myvar ...
вместо этого используйте для сохранения в переменнойmyvar
(в зависимости от обычного поведения цикла чтения / подоболочки)printf "\n"
если требуетсяВы можете заставить вышеописанное работать,
zsh
если вы используете массивmatch[]
вместоBASH_REMATCH[]
, и вычитаете 1 из всех индексов, так какzsh
не сохраняете элемент 0 со всем соответствием.источник
С
zsh
только:Или
с
ksh93
только:Только с любой оболочкой POSIX (также избегая конечного пробела, если длина ввода кратна 4):
Теперь это для персонажей . Если вы хотите сделать это на кластерах графемы (например, разбить
Stéphane
, записать как$'Ste\u0301phane'
, какStép hane
и нетSte phan e
), с помощьюzsh
:С помощью ksh93 вы также можете разбить экран по ширине, что сработало бы для этого
Stéphane
выше, но также могло бы помочь, когда используются некоторые другие виды символов нулевой или двойной ширины:источник
Я собираюсь ответить, вставляя только пробелы по мере необходимости, чтобы пробел появлялся как минимум после каждых 4 символов в строке; не уверен, каким образом вы хотите справиться с этим делом. Например, если ввести «aa bbccdd», вы получите вывод «aa bbcc dd», а не «aa b bccd d».
Я использую Perl для просмотра, но я не очень знаком с Perl в целом, поэтому могут потребоваться некоторые изменения:
источник
Я сделал это с помощью Python
Сначала я читаю файл, затем делю на 4 символа и добавляю пробел
/root/l.txt ==> Состоит из контента, который вы дали в примере
выход
источник