I have written an awk command
awk 'NR==5 {sub(substr($1,14,1),(substr($1,14,1) + 1)); print "test.py"}' > test.py
This is trying to change the 14th character on the 5th line of a python file. For some reason this doesn’t stop executing and I have to break it. It also deletes the contents of the file.
Sample input:
JavaScript
x
import tools
tools.setup(
name='test',
tagvisc='0.0.8',
packages=tools.ges(),
line xyz
)
`
Output:
JavaScript
import tools
tools.setup(
name='test',
tagvisc='0.0.9',
packages=tools.ges(),
line xyz
)
Advertisement
Answer
Get away from the fixed line number (NR==5
) and fixed character position (14
) and instead look at dynamically finding what you want to change/increment, eg:
JavaScript
$ cat test.py
import tools
tools.setup(
name='test',
tagvisc='0.0.10',
packages=tools.ges(),
line xyz
)
One awk
idea to increment the 10
(3rd line, 3rd numeric string in line):
JavaScript
awk '
/tagvisc=/ { split($0,arr,".") # split line on periods
sub("." arr[3]+0 "47","." arr[3]+1 "47") # replace .<oldvalue>47 with .<newvalue>47; 47 == single quote
}
1
' test.py
NOTES:
arr[3]
=10',
; witharr[3]+0
awk
will take the leftmost all-numeric content, strip off everything else, then add0
, leaving us witharr[3]
=10
; same logic applies forarr[3]+1
(arr[3]+1
=11
); basically a trick for discarding any suffix that is not numeric- if there are multiple lines in the file with the string
tagvisc='x.y.z'
then this will changez
in all of the lines; we can get around this by adding some more logic to only change thefirst
occurrence, but I’ll leave that out for now assuming it’s not an issue
This generates:
JavaScript
import tools
tools.setup(
name='test',
tagvisc='0.0.11',
packages=tools.ges(),
line xyz
)
If the objective is to overwrite the original file with the new values you have a couple options:
JavaScript
# use temporary file:
awk '...' test.py > tmp ; mv tmp test.py
# if using GNU awk, and once accuracy of script has been verified:
awk -i inplace '...' test.py