Estou tentando encontrar uma maneira de determinar a diferença entre duas strings em meu script. Eu poderia fazer isso facilmente com diff ou comm, mas não estou lidando com arquivos e prefiro não gerá-los em arquivos, fazer a comparação e ler de volta.
Vejo que comm, diff, cmp permitem a passagem de dois arquivos OU um arquivo e entrada padrão - acho que é bom se eu não quero dois arquivos de saída ... mas ainda assim é um bocado chato.
Andei vasculhando pensando que posso usar grep ou expressões regulares - mas acho que não.
Respostas:
Usando
diff
oucom
ou o que você quiser:FAQ do Greg's Bash: Substituição de Processo
ou com um tubo nomeado
Perguntas frequentes do Greg's Bash: Trabalhando com Pipes Nomeados
O pipe nomeado também é conhecido como FIFO.
O
-
próprio é para entrada padrão.<<<
é uma "string aqui".&
é parecido,;
mas o coloca em segundo planofonte
FUNC(){ echo "$@"; "$@"; }; FUNC diff <(echo a) <(echo b);
$ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.")
\n
1c1
\n
< Here are the letters in String One.
\n
---
\n
> Here are the characters in String Two.
\n
Usar o pipe é semelhante, exceto que mostra um número de processo, começa com o1c1
depois do próximo$
e espera até que você pressione <kbd> Enter <kbd> (ou você pode fazer outros comandos ...)Isso me lembra desta questão: Como você pode diferenciar dois pipelines no Bash?
Se você estiver em uma sessão bash, poderá fazer:
com a
<
criação de pipes nomeados anônimos - gerenciados pelo bash - para que sejam criados e destruídos automaticamente, ao contrário dos arquivos temporários.Portanto, se você conseguir isolar suas duas strings diferentes como parte de um comando (grep, awk, sed, ...), você pode fazer - por exemplo - algo como:
(se você acha que tem em seu arquivo linhas como
string1=very_complicated_value
e astring2=another_long_and_complicated_value'
: sem saber o formato interno de seu arquivo, não posso recomendar um comando preciso)fonte
Eu prefiro um
cmp
recurso de Substituição de Processo do bash:Dizendo na posição 2, ab ocorre para o primeiro, mas aq para o segundo. Na posição 5, outra diferença está acontecendo. Basta substituir essas strings por variáveis e pronto.
fonte
Digamos que você tenha três cordas
Para remover o prefixo b de um
Para remover o sufixo c de um
fonte
echo "$a" | sed "s!^$b!!g"
(eu troquei o separador sed padrão / for! No caso das variáveis sendo tratadas serem caminhos. Além disso, você poderia usar uma string here em vez de echo:.sed ... <<< $a
)Outro exemplo:
Saídas
Resposta original aqui
fonte