Comandos Linux - Comando ed - Linux Force Security - Cursos de Linux e Segurança da Informação
Comandos Linux - Comando ed
Comandos Linux ed e red
Nos sistemas operacionais do tipo Unix, ed é um editor de arquivos interativo.
vermelho , abreviação de "edição restrita", é uma versão do ed que contém restrições sobre os tipos de edição que podem ser executados.
ed é um dos programas de edição mais antigos do mercado. Foi introduzido em 1969 , aproximadamente 50 anos atrás, como um dos componentes originais do Unix .
ed [ opções ] [ arquivo ]
vermelho [ opções ] [ arquivo ]
-h , –help Exiba uma mensagem de ajuda e saia.
-V , –version Informações de versão de saída e saída.
-G , – tradicional Execute no modo de compatibilidade.
-l , –loose-exit-status Saia com um status zero (finalização normal) mesmo se um comando falhar. Essa opção pode ser útil se ed estiver definido como o editor do crontab , por exemplo.
-p , –prompt = STRING normalmente espera pela entrada do usuário em uma linha em branco; essa opção usará a string STRING como o prompt .
-r , –restricted Execute no modo restrito.
-s , –quiet , –silent Suprimir diagnósticos.
-v , –verbose Opere verbalmente .
ed é um editor de texto orientado a linhas com uma interface mínima. É usado para criar, exibir, modificar e manipular arquivos de texto .
Se ed for chamado com um argumento de nome de arquivo, uma cópia do arquivo será lida no buffer do editor. Alterações são feitas nessa cópia e não diretamente no próprio arquivo. Ao sair do ed , quaisquer alterações não salvas explicitamente com um comando ' w ' são perdidas.
A edição é realizada em dois modos distintos: comando e entrada . Quando invocado pela primeira vez, ed está no modo de comando . Nesse modo, os comandos são lidos a partir da entrada padrão e executados para manipular o conteúdo do buffer do editor. Um comando típico pode se parecer com:
, s / antigo / novo / g
que substitui todas as ocorrências da cadeia antiga pela nova .
Quando um comando de entrada, como ' a ' (anexar), ' i ' (inserir) ou ' c ' (alterar) é fornecido, o item entra no modo de entrada . Este modo é o principal meio de adicionar texto a um arquivo. Nesse modo, nenhum comando está disponível; em vez disso, a entrada padrão é gravada diretamente no buffer do editor. As linhas consistem em texto até e incluindo um caractere de nova linha . O modo de entrada é encerrado inserindo um único período (" . ") Em uma linha.
Uma coisa importante a lembrar é que todos os comandos ed operam em linhas inteiras ou intervalos de linhas. Por exemplo, o comando ' d ' exclui linhas; o comando ' m ' move linhas, e assim por diante. É possível modificar apenas uma parte de uma linha por substituição específica, como no exemplo acima; embora, mesmo assim, o comando ' s ' seja aplicado a linhas inteiras de cada vez.
Em geral, os comandos ed consistem em zero ou mais endereços de linha, seguidos por um comando de caractere único e possivelmente parâmetros adicionais. Os comandos têm a estrutura:
Comando [ endereço [, endereço ]] [ parâmetros ]
Os endereços indicam a linha ou o intervalo de linhas a serem afetadas pelo comando. Se menos endereços forem fornecidos do que o comando aceita, os endereços padrão serão fornecidos.
Endereços de linha
Um endereço representa o número de uma linha no buffer. ed mantém um endereço atual que é fornecido aos comandos como o endereço padrão, se nenhum outro for especificado.
Quando um arquivo é lido pela primeira vez, o endereço atual é definido para a última linha do arquivo. Em geral, a qualquer momento, o endereço atual é definido para a última linha afetada por um comando.
Pense no endereço como um marcador de local para a última linha do arquivo em que ed fez algo e, a menos que seja dito o contrário, a linha em que ele irá operar a seguir.
Referindo-se a endereços de linha
Uma referência a um endereço de linha é construída a partir de uma das bases na lista abaixo, opcionalmente seguida por um deslocamento numérico. O deslocamento pode incluir qualquer combinação de dígitos, operadores (por exemplo, " + " e " – ") e espaço em branco . Os endereços são lidos da esquerda para a direita e seus valores são calculados em relação ao endereço atual.
Uma exceção à regra que endereços representa números de linha é o endereço especial 0 (zero). Este endereço significa "antes da primeira linha" e pode ser usado em qualquer comando.
Intervalos de endereço
Um intervalo de endereços é de dois endereços separados por vírgula (" , ") ou ponto e vírgula (" ; "). O valor do primeiro endereço em um intervalo não pode exceder o valor do segundo. Se apenas um endereço for fornecido em um intervalo, o segundo endereço será definido para o endereço fornecido.
Cada endereço em um intervalo delimitado por vírgulas é interpretado em relação ao endereço atual. Em um intervalo delimitado por ponto e vírgula, o primeiro endereço é usado para definir o endereço atual e o segundo endereço é interpretado em relação ao primeiro.
Os seguintes símbolos de endereço são reconhecidos:
. A linha atual (endereço) no buffer.
$ A última linha no buffer.
n A nésima linha do buffer, em que n é um número no intervalo [0, $] .
– A linha anterior. Esta opção é equivalente a -1 e pode ser repetida com efeito cumulativo.
^ n A nésima linha anterior, onde n é um número não negativo.
+ A próxima linha. Esta opção é equivalente a +1 e pode ser repetida com efeito cumulativo.
+ n A nésima próxima linha, em que n é um número não negativo.
, As linhas da primeira à última no buffer. Esta opção é equivalente ao intervalo de endereços 1, $ .
; A corrente através das últimas linhas no buffer. Esta opção é equivalente ao intervalo de endereços ., $.
/ re / A próxima linha que contém a expressão regular re . A pesquisa termina no início do buffer e continua até a linha atual, se necessário. // repete a última pesquisa.
? re ? A linha anterior que contém a expressão regular re . A pesquisa termina no final do buffer e continua até a linha atual, se necessário. ?? repete a última pesquisa.
' lc A linha previamente marcada por um comando ' k ' (marca), em que lc é uma letra minúscula .
Expressões regulares são padrões usados ​​na seleção de texto. Por exemplo, o comando ed
imprime todas as linhas que contêm string . Expressões regulares também são usadas pelo comando ' s ' para selecionar texto antigo a ser substituído por novo. Além de especificar literais de string, expressões regulares podem representar classes de strings. Se for possível para uma expressão regular corresponder a várias seqüências de caracteres em uma linha, a correspondência mais longa à esquerda é a selecionada.
Os seguintes símbolos são usados ​​na construção de expressões regulares:
c Qualquer caractere c não listado abaixo, incluindo ' { ', ' } ', ' ( ', ' ) ', ' < ' e ' > ', corresponde a si mesmo.
\ c Um caractere de escape com barra invertida c que não seja ' { ', ' } ', ' ( ', ' ) ', ' < ', ' > ', ' b ', ' B ', ' w ', ' W ', ' 'e' ? 'corresponde a si próprio.
. Corresponde a qualquer caractere único.
[ classe char ] Corresponde a qualquer caractere único na classe char . Para incluir um ' ] ' na classe char , ele deve ser o primeiro caractere. Um intervalo de caracteres pode ser especificado separando os caracteres finais do intervalo com um ' – '; por exemplo, ' az ' especifica os caracteres minúsculos. As seguintes expressões literais também podem ser usadas na classe char para especificar conjuntos de caracteres:
[:mais baixo:]
[:espaço:]
[:alfa:]
[: dígito:]
[:impressão:]
[:superior:]
[:em branco:]
[:gráfico:]
Se ' – ' aparecer como o primeiro ou o último caractere da classe char , ele corresponderá a si próprio. Todos os outros caracteres da classe char se combinam.
Padrões na classe char do formulário:
em que col-elm é um elemento de intercalação interpretado de acordo com a localidade do sistema.
[^ classe de char ] Corresponde a qualquer caractere único, exceto nova linha, que não seja da classe char . char-class é definido como acima.
^ Se ' ^ ' é o primeiro caractere de uma expressão regular, ele ancora a expressão regular no início de uma linha. Caso contrário, ele corresponde a si mesmo.
$ Se ' $ ' for o último caractere de uma expressão regular, ele ancora a expressão regular no final de uma linha. Caso contrário, ele corresponde a si mesmo.
\ ( re \) Define uma subexpressão (possivelmente nula ) re . Subexpressões podem ser aninhadas . Uma referência posterior subsequente do formato ' \ n ', em que n é um número no intervalo [1,9] , se expande para o texto correspondido pela nésima subexpressão. Por exemplo, a expressão regular ' \ (ac \) \ 1 ' corresponde à sequência ' abcabc ', mas não ' abcadc '. Subexpressões são ordenadas em relação ao seu delimitador esquerdo.
* Corresponde à expressão regular ou subexpressão de um caractere imediatamente antes dela zero ou mais vezes. Se ' * ' for o primeiro caractere de uma expressão regular ou subexpressão, ele corresponderá a si próprio. O operador ' * ' às vezes produz resultados inesperados. Por exemplo, a expressão regular ' b * ' corresponde ao início da string ' abbb ', em oposição à substring ' bbb ', pois uma correspondência nula é a única correspondência à esquerda.
\ { n , m \}
\ { n , \ }
\ { n \} Corresponde à expressão regular ou subexpressão de um caractere imediatamente anterior a ela pelo menos n e no máximo m vezes. Se m for omitido, ele corresponderá pelo menos n vezes. Se a vírgula também for omitida, ela corresponderá exatamente n vezes. Se qualquer uma dessas formas ocorrer primeiro em uma expressão regular ou subexpressão, ela será interpretada literalmente (por exemplo, a expressão regular ' \ {2 \} ' corresponde à string ' {2} ' e assim por diante).
\> Ancora a expressão regular ou subexpressão de um caractere imediatamente após o início ( \ < ) ou o final ( \ < ) de uma palavra, ou seja, em ASCII , uma sequência máxima de caracteres alfanuméricos, incluindo o sublinhado (" _ ").
Os seguintes operadores estendidos são precedidos por uma barra invertida ( \ ) para distingui-los da sintaxe ed tradicional.
\ ' Corresponde incondicionalmente ao início ( \ ' ) ou final ( \' ) de uma linha.
\? Corresponde opcionalmente à expressão regular ou subexpressão de um caractere imediatamente anterior a ela. Por exemplo, a expressão regular ' a [bd] \? C ' corresponde às seqüências de caracteres ' abc ', ' adc ' e ' ac '. Se \? ocorre no início de uma expressão regular ou subexpressão e corresponde a um literal ' ? '
\ + Corresponde à expressão regular ou subexpressão de um caractere imediatamente anterior uma ou mais vezes. Portanto, a expressão regular ' a \ + ' é uma abreviação de ' aa * '. Se \ + ocorrer no início de uma expressão regular ou subexpressão, ele corresponderá a um ' + ' literal.
\ b Corresponde ao início ou final (sequência nula) de uma palavra. Portanto, a expressão regular ' \ bhello \ b ' é equivalente a ' \ <hello \> '. No entanto, ' \ b \ b ' é uma expressão regular válida, enquanto ' \ <\> ' não é.
\ B Corresponde (uma sequência nula) dentro de uma palavra.
\W Corresponde a qualquer caractere em uma palavra.
\W Corresponde a qualquer caractere que não esteja em uma palavra.
Todos os comandos ed são caracteres únicos, embora alguns exijam parâmetros adicionais. Se os parâmetros de um comando se estenderem por várias linhas, cada linha, exceto a última, deverá ser finalizada com uma barra invertida ( \ ).
Em geral, no máximo um comando é permitido por linha. No entanto, a maioria dos comandos aceita um sufixo de impressão, que é ' p ' (impressão), ' l ' (lista) ou ' n ' (enumerar), para imprimir a última linha afetada pelo comando.
Uma interrupção (normalmente ^ C ) tem o efeito de interromper o comando atual e retornar o editor ao modo de comando.
ed reconhece os seguintes comandos. Os comandos são mostrados juntamente com o endereço padrão ou o intervalo de endereços fornecido, se nenhum for especificado (entre colchetes).
[ .,. ] a Anexa o texto ao buffer após a linha endereçada, que pode ser o endereço 0 (zero). O texto é inserido no modo de entrada. O endereço atual está definido para a última linha inserida.
[ .,. ] c Altera as linhas no buffer. As linhas endereçadas são excluídas do buffer e o texto é anexado em seu lugar. O texto é inserido no modo de entrada. O endereço atual está definido para a última linha inserida.
[ .,. ] d Exclui as linhas endereçadas do buffer. Se houver uma linha após o intervalo excluído, o endereço atual será definido para esta linha. Caso contrário, o endereço atual é definido para a linha antes do intervalo excluído.
[ .,. ] e arquivo Edita o arquivo e define o nome do arquivo padrão. Se o arquivo não for especificado, o nome do arquivo padrão será usado. Quaisquer linhas no buffer são excluídas antes da leitura do novo arquivo. O endereço atual está definido para a última linha lida.
e ! comando Edita a saída padrão de ' ! comando ', (veja ! comando abaixo). O nome do arquivo padrão é inalterado. Quaisquer linhas no buffer são excluídas antes da leitura da saída do comando. O endereço atual está definido para a última linha lida.
Arquivo E Edita o arquivo incondicionalmente. Essa opção é semelhante ao comando e , exceto que as alterações não escritas são descartadas sem aviso. O endereço atual está definido para a última linha lida.
arquivo f Define o nome do arquivo padrão para o arquivo . Se o arquivo não for especificado, o nome do arquivo sem escape padrão será impresso.
[ 1, $ ] g / re / lista de comandos Aplica a lista de comandos a cada uma das linhas endereçadas que correspondem a uma expressão regular re . O endereço atual é definido como a linha correspondente atualmente antes da execução da lista de comandos . No final do comando ' g ', o endereço atual é definido para a última linha afetada pela lista de comandos .
Cada comando na lista de comandos deve estar em uma linha separada e todas as linhas, exceto a última, devem ser finalizadas por uma barra invertida ( \ ). Quaisquer comandos são permitidos, exceto ' g ', ' G ', ' v ' e ' V '. Uma nova linha sozinha na lista de comandos é equivalente a um comando ' p '.
[ 1, $ ] G / re / Edita interativamente as linhas endereçadas que correspondem a uma expressão regular re . Para cada linha correspondente, a linha é impressa, o endereço atual é definido e o usuário é solicitado a inserir uma lista de comandos . No final do comando ' G ', o endereço atual é definido como a última linha afetada pela (a última) lista de comandos .
O formato da lista de comandos é o mesmo do comando ' g '. Somente uma nova linha atua como uma lista de comandos nula. Um único ' & ' repete a última lista de comandos não nulos.
H Alterna a impressão de explicações de erro. Por padrão, as explicações não são impressas. É recomendável que os scripts ed iniciem com este comando para ajudar na depuração.
h Imprime uma explicação do último erro.
[ . ] i Insere o texto no buffer antes da linha atual. O texto é inserido no modo de entrada. O endereço atual está definido para a última linha inserida.
[ .,. + 1 ] j Junta as linhas endereçadas. As linhas endereçadas são excluídas do buffer e substituídas por uma única linha contendo o texto associado. O endereço atual está definido para a linha resultante.
[ . ] k c Marca uma linha com uma letra minúscula c . A linha pode então ser endereçada como ' c (uma citação única seguida por c ) nos comandos subseqüentes. A marca não é apagada até que a linha seja excluída ou modificada.
[ .,. ] l Imprime as linhas endereçadas sem ambiguidade. Se invocado a partir de um terminal, ed pausa no final de cada página até que uma nova linha seja inserida. O endereço atual está definido para a última linha impressa.
[ .,. ] m [ . ] Move linhas no buffer. As linhas endereçadas são movidas para após o endereço de destino correto, que pode ser o endereço 0 (zero). O endereço atual está definido para a última linha movida.
[ .,. ] n Imprime as linhas endereçadas junto com seus números de linha. O endereço atual está definido para a última linha impressa.
[ .,. ] p Imprime as linhas endereçadas. Se invocado a partir de um terminal, ed pausa no final de cada página até que uma nova linha seja inserida. O endereço atual está definido para a última linha impressa.
P Ativa e desativa o prompt de comando. A menos que um prompt tenha sido especificado com a opção de linha de comando -p string , o prompt de comando é desativado por padrão.
q Sai do ed .
Q Sai ed incondicionalmente. Esta opção é semelhante ao comando q , exceto que as alterações não escritas são descartadas sem aviso.
arquivo [ $ ] r Lê o arquivo após a linha endereçada. Se o arquivo não for especificado, o nome do arquivo padrão será usado. Se não houver um nome de arquivo padrão antes do comando, o nome do arquivo padrão será definido como arquivo . Caso contrário, o nome do arquivo padrão é inalterado. O endereço atual está definido para a última linha lida.
comando [ $ ] r ! Lê para após a linha endereçada a saída padrão de ' ! Command ', (veja o comando! Abaixo). O nome do arquivo padrão é inalterado. O endereço atual está definido para a última linha lida.
[ .,. ] s / re / substituição /
[ .,. ] s / re / substituição / g
[ .,. ] s / re / substituição / n Substitui o texto nas linhas endereçadas que correspondem a uma expressão regular re com substituição. Por padrão, apenas a primeira correspondência em cada linha é substituída. Se o sufixo ' g ' (global) for fornecido, todas as correspondências a serem substituídas. O sufixo ' n ', em que n é um número positivo, faz com que apenas a nésima combinação seja substituída. É um erro se nenhuma substituição for realizada em qualquer uma das linhas endereçadas. O endereço atual é definido como a última linha afetada.
A substituição e a substituição podem ser delimitadas por qualquer caractere que não seja espaço e nova linha (consulte o comando ' s ' abaixo). Se um ou dois dos últimos delimitadores forem omitidos, a última linha afetada será impressa como se o sufixo de impressão ' p ' tivesse sido especificado.
Um ' & ' sem escape em substituição é substituído pelo texto correspondente no momento. A sequência de caracteres ' \ m ', em que m é um número no intervalo [1,9] , é substituída pela mésima expressão de referência anterior do texto correspondente. Se a substituição consistir em um único ' % ', a substituição da última substituição será usada. As novas linhas podem ser incorporadas em substituição se forem escapadas com uma barra invertida ( \ ).
[ .,. ] s Repete a última substituição. Essa forma do comando ' s ' aceita um sufixo de contagem ' n ' ou qualquer combinação dos caracteres ' r ', ' g ' e ' p '. Se um sufixo de contagem ' n ' for fornecido, somente a enésima correspondência será substituída. O sufixo ' r ' faz com que a expressão regular da última pesquisa seja usada em vez da expressão da última substituição. O sufixo ' g ' alterna o sufixo global da última substituição. O sufixo ' p ' alterna o sufixo de impressão da última substituição. O endereço atual está definido para a última linha afetada.
[ .,. ] t [ . ] Copia as linhas endereçadas para depois do endereço de destino correto, que pode ser o endereço 0 (zero). O endereço atual está definido para a última linha copiada.
você Desfaz o último comando e restaura o endereço atual para o que era antes do comando. Os comandos globais ' g ', ' G ', ' v ' e ' V '. são tratados como um único comando por desfazer. ' u ' é o seu próprio inverso.
[ 1, $ ] v / re / lista de comandos Aplica a lista de comandos a cada uma das linhas endereçadas que não correspondem a uma expressão regular re . Esta opção é semelhante ao comando ' g '.
[ 1, $ ] V / re / Edita interativamente as linhas endereçadas que não correspondem a uma expressão regular re . Esta opção é semelhante ao comando ' G '.
Arquivo [ 1, $ ] w Grava as linhas endereçadas no arquivo. Qualquer conteúdo anterior do arquivo é perdido sem aviso. Se não houver um nome de arquivo padrão, o nome de arquivo padrão será definido como arquivo ; caso contrário, ele não será alterado. Se nenhum nome de arquivo for especificado, o nome do arquivo padrão será usado. O endereço atual é inalterado.
[ 1, $ ] arquivo wq Grava as linhas endereçadas no arquivo e, em seguida, executa um comando ' q '.
Comando [ 1, $ ] w ! Grava as linhas endereçadas na entrada padrão do ' ! Command ', (veja o comando! Abaixo). O nome do arquivo padrão e o endereço atual permanecem inalterados.
[ 1, $ ] arquivo W Anexa as linhas endereçadas ao final do arquivo. Esta opção é semelhante ao comando ' w ', espere que o conteúdo anterior do arquivo não seja derrotado. O endereço atual é inalterado.
[ . ] x Copia (coloca) o conteúdo do buffer de corte para depois da linha endereçada. O endereço atual está definido para a última linha copiada.
[ .,. ] y Copia (puxa) as linhas endereçadas para o buffer de corte. O buffer de corte é substituído pelos comandos subsequentes ' y ', ' s ', ' j ', ' d ' ou ' c '. O endereço atual é inalterado.
[ . + 1 ] z n Rola n linhas por vez, começando na linha endereçada. Se n não for especificado, o tamanho da janela atual será usado. O endereço atual está definido para a última linha impressa.
! comando Executa o comando via sh . Se o primeiro caractere do comando for ' ! ', é substituído pelo texto do' ! comando 'anterior. ed não processa o comando para escapes de barra invertida ( \ ). No entanto, um ' % ' sem escape é substituído pelo nome do arquivo padrão. Quando o shell retorna da execução, um ' ! 'é impresso na saída padrão. A linha atual permanece inalterada.
[ .,. ] # Começa um comentário ; o restante da linha, até uma nova linha, é ignorado. Se um endereço de linha seguido de um ponto e vírgula for fornecido, o endereço atual será definido para esse endereço. Caso contrário, o endereço atual é inalterado.
[ $ ] = Imprime o número da linha endereçada.
[ . + 1 ] Imprime a linha endereçada e define o endereço atual para essa linha.
red opera exatamente como ed , exceto que ele pode editar apenas arquivos no diretório atual e não pode executar comandos shell.
A maneira mais simples de iniciar o ed é apenas executá-lo sem opções na linha de comando:
Este comando coloca o cursor em uma nova linha, mas você não receberá nenhum outro aviso ou indicação de que está com problemas. Para sair do ed e retornar ao prompt de comando do seu shell, digite q e pressione enter:
Você também pode ter parado de usar um Q maiúsculo, que é um encerramento "incondicional": ele será encerrado independentemente se houver alterações que ainda não foram gravadas em um arquivo.
Vamos voltar ao ed :
Agora vamos digitar intencionalmente um comando que o ed não reconhecerá, para causar um erro. Não há comando o , então vamos digitar o seguinte:
O " ? " Significa que algo deu errado. Por padrão, ed possui uma interface tão mínima que não fornece uma mensagem de erro específica. Se ocorreu um erro, você pode descobrir o que aconteceu usando o comando h :
E então ed está pronto para outro comando.
Para ativar as mensagens de erro para que elas sempre sejam exibidas imediatamente por padrão, use o comando H :
Tornando ed mais amigável
É mais fácil de usar ed se você tiver um prompt de comando. Vamos sair do ed …
… que retorna ao prompt de comando do nosso shell. Agora vamos começar o ed novamente usando a opção -p , que informa ao ed para usar um prompt de comando. Especificamos qual prompt queremos usar como uma sequência imediatamente após -p . Por exemplo, vamos usar o prompt simples ' > '. Veja como chamaremos ed :
ed -p '>'
Agora, quando o ed for lançado, veremos nosso prompt:
Adicionando texto e visualizando-o
Como não fornecemos um nome de arquivo, ele nos inicia com um buffer vazio para inserir texto. Vamos entrar agora. Usaremos o comando a para adicionar texto; nos comandos abaixo, também mostraremos o prompt antes do comando, para maior clareza.
Agora temos linhas em branco onde podemos digitar nosso texto. Entraremos como em qualquer processador de texto, pressionando enter no final de cada linha. Quando terminarmos, inseriremos um período sozinho em uma nova linha, para informar que terminamos:
Linha um,
linha dois,
linha três,
linha quatro.
Entramos em quatro linhas; o editor sai de lá e nos fornece outro prompt de comando ed . Se inserirmos o comando p , ele imprimirá a linha em que paramos de editar:
A maioria dos comandos ed pode ser prefixada com um intervalo de endereços para especificar qual intervalo aplicar ao texto. Portanto, se quisermos imprimir as linhas 1 a 4 , poderíamos usar o comando 1,4p :
Se omitirmos os números de linha (mas deixarmos a vírgula), ed assumirá os valores máximos de início e de término, para imprimir o buffer inteiro:
> , p
Caso esqueçamos em que número de linha paramos, podemos usar o comando = :
Podemos continuar adicionando linhas usando o comando a novamente e inserindo um ponto em uma nova linha quando terminarmos:
Linha cinco.
Agora estamos na linha 5:
Podemos mudar para outra linha digitando o número da linha. Quando o fizermos, ed imprimirá essa linha para nos informar onde estamos:
Agora, se inserirmos um , começaremos a adicionar linhas após a linha 3. Ou podemos usar o comando i para começar a inserir linhas antes da linha 3:
Esta é a nova linha três.  Todas as linhas depois disso são desativadas por uma!
Vamos verificar para onde o editor nos deixa após essa inserção. Isso é conhecido como onde o buffer é "endereçado" e deve ser a última linha do buffer:
Vejamos as seis linhas:
Vamos excluir a terceira linha usando o comando d . Colocaremos um 3 antes de d para especificar que a linha 3 é a linha a ser excluída:
… e veja o buffer alterado:
Se você deseja visualizar linhas com o número da linha no início, use o comando n . Por exemplo:
5 Linha cinco.
3 linha três,
2 linha dois,
4 linha quatro.
Para alterar uma linha (substitua-a completamente), você pode usar o comando c . Você pode inserir várias linhas de texto; portanto, ainda é necessário colocar um ponto em uma nova linha para indicar que você terminou:
forre o terceiro,
Também funciona em várias linhas:
E podemos juntar linhas com o comando j :
Vejamos essas mudanças:
Compreendendo intervalos
Vamos explorar os intervalos um pouco mais. Vamos selecionar a linha 2 e imprimir uma linha antes e depois dela:
> -1, + 1p
Já vimos que podemos especificar o buffer inteiro usando uma única vírgula como o intervalo (" , "):
Usamos uma única vírgula (" , ") para representar todo o intervalo de buffer em nossos comandos. Um sinal de porcentagem (" % ") fará a mesma coisa:
> % p
Ao especificar intervalos, podemos representar a última linha usando um cifrão (" $ "):
> 2, $ p
Se você não especificar um intervalo, a maioria dos comandos assumirá um intervalo da linha endereçada no momento. Você também pode especificar explicitamente a linha endereçada no momento usando um ponto (" . "):
Linhas de marcação para referência mais fácil
Você pode marcar uma linha usando o comando k , atribuindo-lhe um "marcador" de qualquer letra minúscula. Você pode consultar a linha marcada usando uma aspas simples seguida por essa letra. Por exemplo, aqui marcamos a linha 3 com a letra a e imprimimos essa linha consultando-a com 'a :
Movendo e copiando linhas
Você pode mover linhas de um lugar para outro usando o comando m :
Você pode copiar linhas para outro local usando o comando t :
Gravando e lendo arquivos
Quando estiver pronto para gravar em um arquivo, você pode usar o comando f para especificar um nome de arquivo:
Agora podemos escrever para myfile.txt usando o comando w . ed nos dirá quantos bytes foram escritos:
Se especificarmos um nome de arquivo após w , ed gravará nesse nome e nos informará quantos bytes:
Para abrir um arquivo para edição, use o comando e com o nome do arquivo que você deseja abrir. ed lerá o arquivo no buffer e informará quantos bytes foram lidos em:
Se você tentar abrir um arquivo para edição quando tiver alterações não salvas no seu buffer atual, você receberá um erro. Para abrir um arquivo de qualquer maneira, perdendo as alterações não escritas no buffer atual, use E maiúsculo:
O mesmo vale para sair do ed : se você tentar usar o comando q para sair e tiver alterações não salvas, receberá um erro. Para sair sem gravar suas alterações, use um Q maiúsculo:
Para abrir um arquivo na linha de comandos, especifique-o como o último argumento ao chamar ed . O arquivo será lido no buffer e ed relatará quantos bytes foram lidos e fornecerá um prompt para um comando. Por exemplo:
ed -p '>' meuarquivo.txt
Vamos excluir todas as linhas do nosso buffer e refazer o arquivo antes dos próximos exemplos:
> , d
Embora eu suspeite que você seja feito principalmente de hidrogênio.
Para procurar texto no seu arquivo, use o comando / com o texto para procurar:
> / cintilar
Para executar globalmente um comando nas linhas correspondentes a uma expressão regular, use o formulário de comando g / regular-expression / command . Por exemplo, aqui vamos procurar globalmente linhas contendo as letras consecutivas " re " e imprimir essas linhas:
> g / re / p
Para executar um comando nas linhas que não correspondem a uma determinada expressão regular, use o formulário de comando v / regular-expression / command :
> v / re / p
Para executar a substituição de texto, use o formulário de comando s / texto-para-substituir / texto-de-substituição / . Vamos especificar um intervalo antes de s para que ele pesquise mais do que apenas a linha atualmente endereçada:
> , s / hidrogênio / hidrogênio e hélio /
Embora eu suspeite que você seja feito principalmente de hidrogênio e hélio.
Por padrão, apenas a primeira ocorrência de texto a substituir em uma linha será substituída. Para substituir todas as ocorrências em cada linha correspondente, especifique g após a segunda barra, para uma substituição "global":
> , s / piscadela / wonk / g
Twonkle, twonkle, estrelinha.
Espero que isso tenha lhe dado familiaridade suficiente com o ed para poder usá-lo e fazer uso das referências disponíveis acima. pode ser muito útil ao trabalhar em um sistema com recursos mínimos do sistema ou ao reparar um sistema que não pode inicializar além de um nível de execução muito básico. É o progenitor de muitos editores modernos e, quando você se acostuma, sua simplicidade pode facilitar a execução de tarefas básicas e importantes.