sed
e aritmética não se misturam. A ferramenta certa para trabalhos como este é awk
.
Considere este arquivo de teste:
$ cat test.txt
/nonmatching/line 1
/home/username/Pictures/properties/wallpaper/span/tree.jpg 2
/another/non/matching/line 5
Podemos incrementar o número da linha que você quer com:
$ line="/home/username/Pictures/properties/wallpaper/span/tree.jpg"
$ awk -v f="$line" '$0~f {$NF++} 1' test.txt
/nonmatching/line 1
/home/username/Pictures/properties/wallpaper/span/tree.jpg 3
/another/non/matching/line 5
Como você pode ver, isso incrementou o número na linha que correspondeu a $line
.
Uma limitação é que esse código, conforme escrito, não preservará vários espaços em branco nas linhas para as quais o número é incrementado. Se os espaços em branco forem importantes, precisaríamos de mais definição do formato de entrada.
Como funciona
-
-v f="$line"
Isso atribui o valor da variável do shell
line
à variável awkf
. -
$0~f {$NF++}
Aqui,
$0~f
é uma condição. Isso é verdadeiro se a linha de entrada, denotada$0
, corresponder à regexf
, conforme definido acima. Se corresponder, a instrução$NF++
será executada. Isso incrementa o último campo na linha que, para sua entrada, é o número. -
1
Esta é uma abreviada enigmática do awk para imprimir a linha.
Editando um arquivo no local com awk
Se você tem um moderno GNU awk, você pode editar o arquivo com:
gawk -i inplace -v f="$line" '$0~f {$NF++} 1' test.txt
Com outros awks, use:
awk -v f="$line" '$0~f {$NF++} 1' test.txt > tmp.txt && mv -f tmp.txt test.txt
Criando text.txt
se não existir
No caso de o arquivo test.txt
não conter uma linha correspondente a $line
, essa versão terá uma linha com 1
como a contagem:
gawk -i inplace -v f="$line" '$0~f {n=1; $NF++} 1; END{if(!n) print f,1>>FILENAME}' test.txt
Este código adiciona uma variável n
. Se $line
estiver no arquivo, n
será definido como 1
. Se não for, n
permanecerá no valor padrão de 0
. No END
do arquivo de entrada, o valor de n
é testado. Se n
ainda for zero, a linha será adicionada.