Como sedinsert.sh contém o comando source
, presumo que você use o bash.
Pergunta 1-2)
Q1.
Você está certo.
Q2.
Na verdade, um pode ter uma variável com o símbolo de nova linha:
sedinsert="I am a
multi line variable
and I kind of work"
O fornecimento será OK na medida em que arquivo variável é um script bash válido.
Para seus objetivos, você pode ter essa variável (com barras invertidas adicionais que precedem cada nova linha):
sedinsert="I am a \
multi line variable \
and I kind of work"
As barras invertidas são necessárias para usar com o sed. Agora você pode usar seu comando sem alterações:
sed -i "\|$sedfind|a\ \n$sedinsert" $sedfile
Questão 2
O comando sed a \
deve ser usado com nova linha como aqui:
sed -i "\|$sedfind|a \
$sedinsert" $sedfile
Por exemplo, o comando
sed "/ping/a \
pong" -i file.txt
Adicionará uma string pong
após cada string que contiver "ping" de substring (sem novas linhas e espaços extras).
Se você não gostar da aparência, poderá usar o mecanismo $'word'
para representar a nova linha:
sed "/ping/a \"$'\n'"pong" -i file.txt
ou
newline=$'\n'
sed "/ping/a \${newline}pong" -i file.txt
Pergunta 3
Em primeiro lugar, todos os símbolos vão até padrão (por exemplo, valor de sedfind
) não o contém. O conteúdo do arquivo $sedfile
não importa. Delimitador é usado apenas para indicação do fim do padrão.
Em segundo lugar, se for necessário usar um caractere delimitador no padrão, é possível escapar de todas as ocorrências com barra invertida:
sed "\|bar\|bar| a \
foo-foo"
adicionará uma string foo-foo
após cada string que contiver bar|bar
Is there some suggested/ standard obscure delimiter to use that's rarely used elsewhere?
Eu não sei nada sobre isso.
A propósito, minha versão do sed não aceita caracteres russos como delimitador (mensagem de erro delimiter character is not a single-byte character
).
Resumo
Agora você pode usar este arquivo variável :
sedfind="# Standard Un\*x authentication." # all occurrences of symbol '|' must be escaped by backslash as far as '|' is sed pattern delimiter
#sedfind=".* Standard Un\*x authentication"
sedinsert="I am a \
multi line variable \
and I kind of work"
sedfile=sshd
E este sedinsert.sh :
set -x
source $1
sed -i "\|$sedfind|a \
$sedinsert" $sedfile
É melhor cercar as variáveis com aspas duplas (caso contrário, o script irá travar em nomes de arquivos com símbolos especiais):
set -x
source "$1"
sed -i "\|$sedfind|a \
$sedinsert" "$sedfile"
Este script adicionará a (s) sequência (s) $sedinsert
após cada linha do arquivo $sedfile
que corresponde ao padrão $sedfind
.
Bom tutorial sobre citações, expressões regulares e scripts sed, pode ser útil: link