grep
предназначен только для (и первоначально )печатал (только )строки, соответствующие шаблону. Вот что grep
означает (на основе командыg/re/p
ed
).
Некоторые grep
реализации добавили несколько функций, которые немного ущемляют роль других команд. Например, у некоторых есть несколько -r
/ --include
/ --exclude
для выполнения части работы find
.
В GNU grep
добавлена опция -o
, которая заставляет выполнять часть работы sed
, позволяя редактировать совпадающие строки.
pcregrep
расширил его с помощью -o1
, -o2
... для печати того, что соответствует группам захвата. Таким образом, с этой реализацией, хотя она и не была предназначена для этого, вы можете фактически заменить:
sed 's/old/new/'
с:
pcregrep --om-separator=new -o1 -o2 '(.*?)old(.*)'
Однако это не работает должным образом, если группы захвата соответствуют пустой строке.На входе типа:
XoldY
Xold
oldY
это дает:
XnewY
X
Y
Вы можете обойти это, используя еще более неприятные приемы, такие как:
PCREGREP_COLOR= pcregrep --color=always '.*old.*' |
pcregrep --om-separator=new -o1 -o2 '^..(.+?)old(.+)..' |
pcregrep -o1 '.(.*).'
То есть добавьте и добавьте\e[m
(раскрашивающую escape-последовательность )ко всем совпадающим строкам, чтобы убедиться, что по обе стороны от old
есть хотя бы один символ, и затем удалите их.
В вашем распоряжении
ssh user_name@192.168.1.xx "bash -s" -- < scripts/machine-info.sh
перенаправление с scripts/machine-info.sh
происходит локально. Это перенаправление в команду ssh
и данные попали бы на стандартный ввод удаленного bash -s
процесса (, если бы файл существовал локально, но его нет, поэтому вы получаете ошибку ).
В других показанных вами примерах доступ к сценарию осуществляется на удаленной машине.
Например, в
ssh user_name@192.168.1.xx 'bash -s -- < scripts/machine-info.sh'
Перенаправление является частью команды, выполняемой на удаленной машине, из-за одинарных кавычек вокруг командной строки.