Replace whole line when match found with sed

前端 未结 4 1764
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-07 20:25

I need to replace the whole line with sed if it matches a pattern. For example if the line is \'one two six three four\' and if \'six\' is there, then the whole

相关标签:
4条回答
  • 2020-12-07 20:42

    This might work for you (GNU sed):

    sed -e '/six/{c\fault' -e ';d}' file
    

    or:

    sed '/six/{c\fault'$'\n'';d}' file
    
    0 讨论(0)
  • 2020-12-07 20:44

    Above answers worked fine for me, just mentioning an alternate way

    Match single pattern and replace with a new one:

    sed -i '/six/c fault' file
    

    Match multiple pattern and replace with a new one(concatenating commands):

    sed -i -e '/one/c fault' -e '/six/c fault' file
    
    0 讨论(0)
  • 2020-12-07 20:55

    You can do it with either of these:

    sed 's/.*six.*/fault/' file     # check all lines
    sed '/six/s/.*/fault/' file     # matched lines -> then remove
    

    It gets the full line containing six and replaces it with fault.

    Example:

    $ cat file
    six
    asdf
    one two six
    one isix
    boo
    $ sed 's/.*six.*/fault/'  file
    fault
    asdf
    fault
    fault
    boo
    

    It is based on this solution to Replace whole line containing a string using Sed

    More generally, you can use an expression sed '/match/s/.*/replacement/' file. This will perform the sed 's/match/replacement/' expression in those lines containing match. In your case this would be:

    sed '/six/s/.*/fault/' file
    

    What if we have 'one two six eight eleven three four' and we want to include 'eight' and 'eleven' as our "bad" words?

    In this case we can use the -e for multiple conditions:

    sed -e 's/.*six.*/fault/' -e 's/.*eight.*/fault/' file
    

    and so on.

    Or also:

    sed '/eight/s/.*/XXXXX/; /eleven/s/.*/XXXX/' file
    
    0 讨论(0)
  • 2020-12-07 21:01

    To replace whole line containing a specified string with the content of that line

    Text file:

    Row: 0 last_time_contacted=0, display_name=Mozart, _id=100, phonebook_bucket_alt=2
    Row: 1 last_time_contacted=0, display_name=Bach, _id=101, phonebook_bucket_alt=2
    

    Single string:

    $ sed 's/.* display_name=\([[:alpha:]]\+\).*/\1/'
    output:
    100
    101
    

    Multiple strings delimited by white-space:

    $ sed 's/.* display_name=\([[:alpha:]]\+\).* _id=\([[:digit:]]\+\).*/\1 \2/'
    output:
    Mozart 100
    Bach 101
    

    Adjust regex to meet your needs

    [:alpha] and [:digit:] are Character Classes and Bracket Expressions

    0 讨论(0)
提交回复
热议问题