Como sedar apenas um pedaço de texto?

1

Digamos que eu tenha um arquivo com 2 linhas, chamado file.txt :

Row 1: 80 is a nice number
Row 2: 80 is a cool number
Row 3: 80 is a piquant number
Row 4: 80 is a sexy number

Eu fiz sed -i 's/80/8080/g' , mas por engano eu corri duas vezes e o resultado em todas as linhas foi 80808080 ao invés de apenas 8080 .

Eu acredito que é mais provável que seja impossível na tecnologia comum, mas eu ainda quero perguntar se talvez, há uma maneira sofisticada de fazer sed fazer o efeito apenas uma vez neste arquivo. Quer dizer, algum tipo de "lock" que evitará acontecer de tais erros como rodar esse sed mais de uma vez o arquivo, até que eu remova o tat lock. Isso pode (e eu enfatizo a palavra "poder") ser útil ao lidar com linhas muito mais longas, especialmente em grandes quantidades.

Não é realmente um problema e eu deveria evitar tal erro e é isso, mas estou curioso para saber se alguém tenta desenvolver algum "mecanismo de defesa" técnico de tais sed erros.

Nota: acredito que uma solução semelhante também pode ser útil para awk usuários.

    
por JohnDoea 10.05.2017 / 20:52

2 respostas

0

Apenas não use -i para edição no local, especialmente se você estiver experimentando algo ou desenvolvendo algum script. Em vez disso, sempre grave em um arquivo temporário. Em seguida, verifique o arquivo para ver se está tudo bem e, possivelmente, substitua o arquivo original por ele.

A opção -i não é padrão e é horrivelmente não portátil entre sed implementações.

A maneira portátil de alterar um arquivo usando sed é

sed 'expression' file >newfile && mv newfile file

awk não tem o mesmo problema. Nenhum de% GNUawk, mawk ou nawk suporta edição no local (o que realmente não é algo que muitas vezes se deseja fazer com awk ), portanto o problema de executar acidentalmente o mesmo awk script sobre um arquivo duas vezes (e obtendo o dobro do "efeito" de editar o arquivo) raramente aparece.

    
por 30.10.2017 / 22:11
2

Isso não é muito sofisticado, mas é uma espécie de mecanismo de defesa, quando a substituição de uma string por uma string que contenha a si mesma é adicionar os caracteres anterior e / ou seguinte para evitar a substituição duplicada.

Por exemplo, acima, eu recomendo algo como um (ou ambos) dos seguintes itens:

  • sed -i 's/ 80 / 8080 /g'
  • sed -i 's/^80 /8080 /g'

Além disso, tenha cuidado com -i :)

    
por 30.10.2017 / 21:47

Tags