Вставить новую строку в оператор perl -e?

4061
portoalet

Рассмотрим следующую строку Perl:

perl -e '$x; $y;' 

Я выполняю эту команду в Bash, и я хотел бы вставить новую строку ( \n) между ;и $y. Я хотел бы знать, как это сделать двумя похожими, но немного разными способами:

  1. Как я могу вставить новую строку в эту позицию, нажав некоторую последовательность мета-клавиш для вставки новой строки?

  2. Как я могу вставить новую строку в эту позицию, набрав некоторую немета-символьную последовательность? (например, '$x;\n$y;')

В обеих ситуациях я хочу, чтобы интерпретатор Perl видел реальную новую строку, например:

$x; $y; 
1
@lydonchandra: почему вы хотите вставить новую строку в однострочник Perl? Peter Mortensen 14 лет назад 1

5 ответов на вопрос

3
Chris Johnsen

Вопрос, который вы задали, касается только того, как оболочка интерпретирует свой ввод и передает его другим программам. По сути, это не имеет ничего общего с Perl.

Этот ответ касается ввода нового ввода в оболочку. Используйте ответ других, ^V^Jчтобы вставить новую строку в существующую командную строку при использовании редактирования командной строки.

Вы должны просто иметь возможность поместить это в скрипт:

foo '$x; $y;' 

Аргумент, переданный команде, будет иметь новую строку в том же месте, что и в самом скрипте. Возможно, вам придется позаботиться о том, чтобы сохранить такой скрипт таким образом, чтобы использовать разрывы строк в стиле Unix (только для LF), в противном случае вы можете получить CR + LF (разрывы строк в DOS / Windows) или просто CR (старый Mac- стиль lineb рождает).

Вы также можете сделать это в интерактивной подсказке, но перед второй и всеми последующими строками вы увидите подсказку продолжения:

$ foo '$x; > $y;' 

В bash вы также можете использовать синтаксис $''цитирования для кодирования символа новой строки, например:

foo $'$x;\n$y;' 

Аргумент, передаваемый программе, будет обрабатываться аналогично строке C ANSI. Если вы хотите, чтобы в строке был фактический обратный слеш \\, вместо этого вы должны будете экранировать его как .

Так что, если вы действительно хотите использовать кавычки из буквенных строк, которые вам дают одинарные кавычки, вам, вероятно, следует придерживаться встроенной новой строки, чтобы вам не пришлось беспокоиться о дополнительном экранировании.

2
Dennis Williamson

Переместите курсор в положение, затем нажмите Ctrl- V Ctrl-J

2
njd

Удалить пространство, а затем введите CtrlV, CtrlJ.
Потом Return.

Ctrl-V не позволяет оболочке интерпретировать следующий символ (перевод строки) буквально.

Как мне сделать такие классные кнопки, как [Return]? drewk 14 лет назад 0
@drewk: Просто введите Ctrl! squircle 14 лет назад 0
1
drewk

Если вы хотите редактировать pico, vi или emacs, вы можете использовать встроенную fcкоманду, которая обозначает fix command.

Вы можете использовать, fcи Bash откроет вашу последнюю команду в определенном редакторе, таком как vi, emacs и т. Д. Я использую для этого пико. Вы можете очень легко использовать многострочное редактирование.

Вы можете использовать перевод строки и формат для редактирования команды. После выхода из редактора команда сохраняется в буфере Bash и сразу же выполняется.

В Bash попробуйте это:

$ FCEDIT=pico $ perl -e '' $ fc 

Команда FCEDIT=picoпросто устанавливает редактор на пико. Установите любой редактор, который вы хотите. Вы можете экспортировать это и сделать постоянным, если хотите.

Команда perl -e ''представляет собой пустую оболочку вокруг вашего нового однострочного сценария Perl. При вводе fcпоследняя команда открывается в определенном редакторе.

Теперь в Pico, подойдите к ''и вставьте свой Perl-скрипт. Помните, что сценарий не такой, как если бы вы сохраняли его в текстовый файл, и ему необходимо знать, как оболочка будет интерпретировать ввод между одинарными кавычками. В основном вам нужно будет избежать одиночной кавычки с\

В pico вставьте любой код Perl, который вы хотите (при условии его интерпретации в Bash ...)

Я сделал это:

perl -e ' print "hello\n"; print "here is a second line\n"; $i=1; $y=2; print "\$i=$i, \$y=$y\n\n"; ' 

Теперь сохраните файл с именем по умолчанию. (В пико, Ctl+Oвыписать) и выйти из пико (Ctl + x). Bash теперь выдает эхо, а затем выполняет вашу команду.

fcзадокументировано в разделе 9.2 руководства GNU ЗДЕСЬ

0
Peter Mortensen

Это почти возможно. В командной строке bash\ (обратный слеш) может использоваться как символ продолжения строки. Это на самом деле спасательный персонаж ; он говорит bash обрабатывать следующий символ в строке как специальный.

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

# +-----Press return here!! # V user@host:$ cat foo | \ > perl -e '$x; $y' 

Если вы удалите одинарную кавычку, '(и, возможно, больше символов) в конце повторяющейся строки,

perl -e '$x;\ $y 

, И нажмите Enterзатем больше символов можно ввести заканчивая одинарные кавычки, '. Обратите внимание, что $ y все еще активен.

Я не могу заставить это работать. это позволяет мне вводить команду в несколько строк, но затем Perl получает новую строку и умирает с ошибкой компиляции. этого не происходит с вышеупомянутым решением ctrl-V + ctrl-J. вы можете использовать обратную косую черту, чтобы перейти на новую строку, если закроете кавычку перед обратной косой чертой и снова откроете новую строку: например, `perl -e '$ x;' \ [ENTER] '$ y'` ... это работает потому что bash игнорирует символ новой строки и объединяет две кавычки в одну строку. но это на самом деле не передает перевод строки в Perl. quack quixote 14 лет назад 0
я также думал о «здесь» документах, но я не могу заставить эту работу также. quack quixote 14 лет назад 0
@ Quack Quixote: спасибо за редактирование. Я тестировал это решение, когда входил через SSH с PuTTY (Windows) на сервер на основе Ubuntu 9.1. Я также вставил операторы печати до и после разрыва строки в однострочнике Perl, чтобы убедиться, что они были выполнены. Но в любом случае другое решение лучше. Peter Mortensen 14 лет назад 0
Я думаю, что я просто неправильно понимаю, что вы пытались объяснить. в вашем примере символ новой строки на самом деле * после * $ y, не так ли? таким образом, он не избежал обратной косой черты, и bash позволяет этому случиться, потому что вы еще не закрыли кавычку. да, это работает; я думал, что вы используете обратную косую черту, чтобы убежать от новой строки, что мне не помогло. quack quixote 14 лет назад 0

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