Eu quero fazer:
cat update_via_sed.sh | sed 's/old_name/new_name/' > new_update_via_sed.sh
no meu programa.
Mas eu quero usar variáveis, por exemplo
old_run='old_name_952'
new_run='old_name_953'
Eu tentei usá-los, mas a substituição não acontece (sem erro). Eu tentei:
cat update_via_sed.sh | sed 's/old_run/new_run/'
cat update_via_sed.sh | sed 's/$old_run/$new_run/'
cat update_via_sed.sh | sed 's/${old_run}/${new_run}/'
Respostas:
Você poderia fazer:
Mas cuidado, isso
$old_run
seria considerado uma expressão regular e, portanto, qualquer caractere especial que a variável contenha, como/
ou.
teria que ser escapado . Da mesma forma, em$new_run
, os caracteres&
e\
precisariam ser tratados especialmente e você teria que escapar dos/
caracteres e nova linha.Se o conteúdo
$old_run
ou$new_run
não estiver sob seu controle, é essencial executar essa fuga ou o código equivale a uma vulnerabilidade de injeção de código .fonte
sed
si só não use regex, massed -E
usaria?-e
é especificar umsed
e xpression , para que possa passar mais de um (como emsed -e exp1 -e exp2
) ou combinações de arquivos e expressões (sed -f file -e exp
). Você pode estar confuso com o-E
que, com algumas implementações, diz ao sed para usar EREs em vez de BREs.-E
eu domine apenas o regex estendido, não o regular. Obrigado pela explicação.sed
implementações para obter ainda mais sintaxes de expressão regular.Isso funcionou:
Como eu quero 'reutilizar' o mesmo arquivo, eu realmente o uso para qualquer pessoa que deseje uma abordagem semelhante:
O exemplo acima criou um novo arquivo e exclui o arquivo atual e renomeia o novo arquivo para o arquivo atual.
fonte
sed -i s/"$old"/"$new"/ update_via_sed.sh
. No entanto, esteja ciente de que isso não funciona para nenhum valor do antigo e do novo. por exemplo, ele não deve conter / etc., pois $ old ainda é uma pesquisa e $ new um padrão de substituição, onde alguns caracteres têm significados especiais.sed -i "s/$old/$new/"
também está ok (com as precauções acima).sed
normalmente considera o separador o primeiro caractere após os
comando - ou seja, se suas variáveis contêm barras,/
mas não digamos em (@
), você pode usar "s @ $ old @ $ new @".Você pode usar variáveis no sed desde que entre aspas duplas (não aspas simples):
Se você tiver uma barra (
/
) na variável, use um separador diferente, como abaixofonte
|
como no meu caso, as variáveis contém um caminho para que ele tenha/
nele|
funcionou para mim no MacOS 10.14, mas outros separadores gostam@
ou#
não. Eu também tinha barras no meu env var.'in-place' sed (usando a bandeira -i) foi a resposta. Graças a Peter.
fonte
s@
(o que não é especial para o shell de forma alguma). O melhor é colocar tudo dentro de aspas, comosed -i "s@$old@$new@" file
. Observe que-i
não é umased
opção padrão .$
neste comando. Como, eu vou mudar$xxx
como um todo para o valor de uma variável$JAVA_HOME
. Eu tenteised -i "s@\$xxx@$JAVA_HOME@" file
, mas erro dizno previous regular expression
man bash
dá isso sobre aspas simplesTudo o que você digita na linha de comando, o bash o interpreta e, em seguida, envia o resultado ao programa para o qual ele deve ser enviado.Neste caso, se você usar
sed 's/$old_run/$new_run/'
, o bash primeiro vê osed
, o reconhece como um executável presente na$PATH
variável . Osed
executável requer uma entrada. Bash procura a entrada e encontra's/$old_run/$new_run/'
. Aspas simples dizem ao bash para não interpretar o conteúdo nelas e passá-las como estão. Então, o bash os passa para o sed. Sed dá um erro porque$
pode ocorrer apenas no final da linha.Em vez disso, se usarmos aspas duplas, isto é, o
"s/$old_run/$new_run/"
bash vê isso e interpreta$old_run
como um nome de variável e faz uma substituição (essa fase é chamada de expansão variável). Isso é realmente o que exigimos.Porém, você deve ter cuidado ao usar aspas duplas, pois elas são interpretadas primeiro pelo bash e depois fornecidas ao sed. Portanto, alguns símbolos como `devem ser escapados antes de serem usados.
fonte
Em risco de ser irreverente - você já considerou
perl
.O que - entre outras coisas - é bastante bom para executar operações 'estilo sed', mas também uma coisa de programação com mais recursos.
Ele olha como no seu exemplo, o que você está realmente tentando fazer é incrementar um número.
Então, que tal:
ou como um estilo único:
fonte
Em
$d1
Estou armazenar valoresComo não posso substituir o valor da variável, tentei o seguinte comando: ele está funcionando
faltando aspas duplas
"${d1}"
, esse foi o errofonte
Assumido
$old_run
e$new_run
já está definido:Isso mostra a alteração na tela. Você pode redirecionar a saída para o arquivo, se necessário.
fonte
Para usar uma variável no sed, use aspas duplas "", para incluir a variável no padrão que você está usando. Por exemplo: a = "Oi" Se você quiser acrescentar a variável 'a' a um padrão, use o seguinte: sed -n "1, / padrão" $ {a} "padrão / p" nome do arquivo
fonte
$a
não é citada aqui, o que significa que qualquer espaço em seu valor invocará a divisão de palavras no shell.Você também pode usar Perl:
fonte
""
) não farão nada.quebrar a corda
bad => linux veja uma string $ old_run:
good => linux veja uma variável $ old_run:
fonte
$old_run
ou$new_run
contém espaços?