sed replace in-line a specific column number value at a specific line number

前端 未结 2 890
旧时难觅i
旧时难觅i 2021-02-04 20:23

I have a 5 columns csv file (space separated) like this :

username1 20130310 enabled 20130310 enabled
username2 20130310 enabled 20130321 disabled
username3 2013         


        
相关标签:
2条回答
  • 2021-02-04 20:56

    This might work for you (GNU sed & Bash):

    lineNumber=4 newValue=xxxx sed -i ${lineNumber}'s/\S\+/'"${newValue}"'/4' file
    

    However beware. If the newValue contains a / you will need to change the substitute command delimiter to something else e.g. s@\S\+@${newValue}@4

    0 讨论(0)
  • 2021-02-04 20:57

    Here is one way:

    $ sed '/^username4/{s/ [^ ]*/ anything/3}' file
    username1 20130310 enabled 20130310 enabled
    username2 20130310 enabled 20130321 disabled
    username3 20130320 disabled 20130321 enabled
    username4 20130310 disabled anything disabled
    
    # store changes back to the file 
    $ sed -i '/^username4/{s/ [^ ]*/ anything/3}' file
    

    But avoiding awk because sed has the -i option isn't a good reason. awk is more suited to working with this kind of problem.

    $ awk '$1=="username4"{$4="anything"}1' file
    username1 20130310 enabled 20130310 enabled
    username2 20130310 enabled 20130321 disabled
    username3 20130320 disabled 20130321 enabled
    username4 20130310 disabled anything disabled
    
    # store changes back to the file
    $ awk '$1=="username4"{$4="anything"}1' file > tmp && mv tmp file
    

    With awk you can easily do field comparison and editing, using shell variable isn't a quoting nightmare and understanding scripts you wrote only yesterday isn't and issue unlike with sed:

    $ linenumber=4
    
    $ newvalue=anything 
    
    $ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file 
    username1 20130310 enabled 20130310 enabled
    username2 20130310 enabled 20130321 disabled
    username3 20130320 disabled 20130321 enabled
    username4 20130310 disabled anything disabled
    
    $ awk 'NR==n{$4=a}1' n=$linenumber a=$newvalue file > tmp && mv tmp file
    
    0 讨论(0)
提交回复
热议问题