Поскольку OP, кажется, непреклонен в использовании «единого вызова» sed
, вот один:
sed -n -e 's/^\W*//' -e 's/\(\W\+\)/\n/gp' words.txt
РЕДАКТИРОВАТЬ :Обратите внимание, что, как указал @don _crissti, это решение не является полным, так как оно не может распечатать слова, которые появляются в строке сами по себе, а также вставить новая строка в самом конце вывода, если в файле отсутствует завершающая новая строка. Чтобы исправить эту проблему, см. Следующее, крайне уродливое решение.
Основная проблема с sed
заключается в том, что пространство шаблонов, на котором работает каждое выражение -e
, всегда определяется строками. Если вы вставите новые строки, тем самым изменив структуру строки между первым выражением и следующим, следующее выражение не сможет работать с обработанными данными.
Во-первых, начальные пробелы, если они есть, обрабатываются в каждой строке. Те, что полностью из него состоят, превращаются в пустые строки, сохраняя при этом длину строки пространства шаблона.
Ключ во второй части представляет собой комбинацию опции -n
и командыp
(print ),который некоторые люди любят называть sed
«режимом grep», и в основном эффекты, которые будут напечатаны только совпавшими и/или измененными строками. -n
запрещает печать любого вывода, а p
принудительно печатает совпадающие и/или измененные строки. Таким образом, вы избежите печати строк, которые были полностью пустыми. Так как \W\+
ожидает по крайней мере один не -словесный символ, пустые строки отсутствуют. И начальные пробелы, которые могли бы соответствовать выражению, ранее превращались в пустые строки.
РЕДАКТИРОВАТЬ :Я забыл объяснить, что отсутствие команды p
в первом выражении также является ключевым. В каждом выражении пространство шаблона обычно печатается, заставляя нас видеть каждую строку столько раз, сколько было выражений, которые ее печатали, с вариациями, если какое-либо из этих выражений также изменило данную строку. Однако, несмотря на то, что пространство шаблонов не печатается, оно переносится в последующие выражения в его измененной форме, что позволяет нам связывать выражения, которые работают с одним конвейером, который начинается с одной входной строки, при этом видя только вывод последнего выражения..
Если вам нравится рассматривать слова как последовательности не -пробельных символов, что ж... так оно и есть, но это определение охватывает гораздо больше, чем просто слова. Это не слова, это не -пробельные последовательности. Однако, если вы хотите сопоставить их и напечатать их в отдельных строках вместо слов, используйте:
sed -n -e 's/^\s*//' -e 's/\(\s\+\)/\n/gp' words.txt
РЕДАКТИРОВАТЬ :Проблема строк с одним словом и отсутствующей новой строкой в EOF, как указано @don _crissti, может быть решена с помощью следующей команды. Хотя он и не слишком длинный, помимо того, что он смехотворно хакерский, у него есть по крайней мере один недостаток, о котором я знаю :, а именно то, что он не работает для файла только с одной строкой, если эта единственная строка содержит несколько слов.Идея решить эту проблему состоит в том, чтобы добавить ветки, чтобы проверить, является ли последняя строка первой, еще больше усложнив программу (и отняв у меня еще больше времени :D ). Вот команда:
sed -rn 's/(\b|\W)+/\x0/g; s/^\x0//; s/\x0$//; s/\x0/\n/g; /^$/d; $! p; $ { s/$/\n/; P }'
Команда работает в следующих проходах:
Во-первых, символы, отличные от -слов, а также границы слов, такие как конец и начало строк, которые являются утверждениями нулевой -ширины, а не символами, заменяются нулевыми -байтами. Это также включает границы слов вместе с их соседними последовательностями символов, отличных от -, где они встречаются в таких позициях.
Затем из начала и конца каждой строки удаляется ноль -байтов.
Затем каждый промежуточный нулевой -байт заменяется новой строкой.
Любые полученные пустые строки удаляются из пространства шаблонов. Здесь нет пробелов -, только строки.
Если адрес текущего пространства шаблонов не является последним адресом (, то есть мы не находимся на последней строке ), мы просто печатаем строку.
В конце наших данных выполняем 2 команды:
Мы добавляем новую строку в конце текущего пространства шаблонов, чтобы иметь по крайней мере 1 завершающую новую строку, даже если исходные данные не заканчивались на нее.
Мы печатаем только до первой встроенной новой строки в нашем текущем пространстве шаблонов, которая имеет максимум 2 новые строки.
Кстати, самое простое решение этой проблемы, которое я видел, это:
grep -o '\w\+' words.txt
Или, если вам не нужно иметь дело со строками, начинающимися с пробела:
fmt -1 words.txt
В моей Chrome OS, версия 91.0.4472.81 (Официальная сборка)(64 -бит ), я сделал следующее :Вставил USB-накопитель, затем правой кнопкой мыши -щелкнул Файлы приложение и выбрал Поделиться с Linux .
Затем USB-накопитель монтируется в:/mnt/chromeos/removable/
(см. здесь для справки ).
Дополнительно:
В вопросе «зайти в настройки и включить мое USB-устройство» означает ли это выполнение следующих шагов?:
При этом USB-накопитель перестанет быть видимым для приложения «Файлы», поэтому диск не будет виден, и, следовательно, не будет возможности использовать параметр «Общий доступ в Linux».