Сопоставить начало строки с тем, что там что-то есть?

[118265] Вы используете не тот пример. ;) Наличие [118728]$PWD[118729] в качестве аргумента к [118730]-c[118731] означает, что вновь созданные панели запускаются в каталоге, сервер [12197]tmux[118855] находится в [118733], другими словами, в каталоге, в котором вы впервые запустили [118734]tmux[118735]. Каталог текущей панели [118736]pane[118737] - это каталог, хранящийся во внутренней переменной [118738]tmux[118739] [118740]#{pane_current_path}[118741]:[12198]Так что правильным способом делать то, что вы хотите быть[12199]Примечание:[118743] Это будет [118744]не[118745] работать, если в вашей текущей панели запущена чья-то оболочка (я на это упал, так что я вам явно говорю): Если у вас запущена сессия [118746]sudo[118747] или [118748]su[118749], то ваша новая панель будет иметь рабочий каталог [118750]/[118751]. Это достаточно просто для того, чтобы объяснить: ваш [118752]tmux[118753] не может получить текущую рабочую директорию запущенного процесса, так как у него нет соответствующих привилегий по соображениям безопасности (вы не можете прочитать жизненно важное состояние процесса иностранного пользователя).[118270].
1
17.07.2015, 03:02
3 ответа
sed '/./s/^/\\section{}/'

Добавлял бы \ section {} к каждой строке, содержащей хотя бы один допустимый символ .

sed '/^$/!s/^/\\section{}/'

Добавляет \ section {} к каждой непустой строке (то есть к строкам, содержащим хотя бы один байт ).

sed 's/./\\section{}&/'

Вставит \ section {} перед первым допустимым символом в каждой строке (имеющей такой допустимый символ). ( & заменяется совпадающей частью).

Эти различия между байтом и символом могут иметь смысл, если вы используете многобайтовую локаль (например, UTF-8, которая в настоящее время является нормой). ), но работает с текстом, закодированным в расширенном однобайтовом наборе символов.

Например:

$ locale charmap
UTF-8
$ echo Москва | iconv -t iso-8859-5 | sed 's/./\\section{}&/' | iconv -f iso-8859-5
Москва

(при кодировании в iso-8859-5 ни одно из значений байтов восстановления для Москвы не является допустимым символом в UTF-8, поэтому /./ не соответствует что-нибудь).

Поскольку в вашем случае кодировка не будет проблемой, поскольку текст, который вы вставляете, в любом случае является ASCII, вы можете исправить языковой стандарт на C, чтобы избежать сюрпризов:

$ echo Москва | iconv -t iso-8859-5 | LC_ALL=C sed 's/./\\section{}&/' | iconv -f iso-8859-5
\section{}Москва
5
27.01.2020, 23:13

Вы можете сделать это двумя операторами с помощью sed : первый, чтобы гарантировать отсутствие пустых строк. совпадает, второй добавляется в начале:

sed '/^$/n;s/^/\\section{}/'

Или вы можете сделать это в одном операторе, захватив то, что вам подходит, и добавив его к своей замене:

sed 's/^\(.\)/\\section{}\1/'

Здесь круглые скобки \ ( и \) определяют группу захвата, на которую ссылается \ 1 в замещающей части оператора.

Также обратите внимание, что для того, чтобы убедиться, что строка не пуста, вам нужно удалить знак вопроса ? после точки . . ? означает «0 или 1», поэтому пустая строка будет соответствовать нулевой длине.

2
27.01.2020, 23:13

Использовать Утверждение положительного упреждения нулевой ширины:

perl -pe 's/^(?=.)/\section{}/'

perlre говорит:

(? = шаблон) Утверждение положительного упреждения нулевой ширины. Например, / \ w + ( ? = \ t) / соответствует слову, за которым следует табуляция, без включения табуляции в $ &

Другое решение:

perl -lpe 's/^/\section{}/ if length'

В конце вы должны пережевывать \ n строки перед проверкой длины.

Параметр -l сделает это за вас.

-l [octnum] включает автоматическую обработку окончания строки. Он имеет два отдельных эффекта. Во-первых, он автоматически перехватывает $ / (разделитель входных записей) при использовании с -n или -p . Во-вторых, он присваивает $ \ (разделитель выходной записи) значение octnum, чтобы в любые операторы печати этот разделитель снова добавлялся.Если octnum опущен, устанавливает $ \ равным текущему значению $ /

0
27.01.2020, 23:13

Теги

Похожие вопросы