Ignore comments (#) using sed, but keep the lines untouched

后端 未结 5 1315
后悔当初
后悔当初 2020-12-16 18:05

I have a config file that I want to basically edit the uncommented lines, but not the commented lines. I\'m using sed.

For example, I have a file calle

5条回答
  •  南方客
    南方客 (楼主)
    2020-12-16 18:16

    To ignore comments that start with a # when doing a substitution, you can use the following command:

    sed -r 'h;s/[^#]*//1;x;s/#.*//;(substitution command);G;s/(.*)\n/\1/' file.txt
    

    In your case it becomes:

    sed -r 'h;s/[^#]*//1;x;s/#.*//;s/test/TEST/g;G;s/(.*)\n/\1/' file.txt
    

    The advantage of this solution over the other solutions is that it will also work if there is a comment starting later in a line, as shown in the example below. Since this solution uses the hold buffer of sed, this solution is not possible if you need to use the hold buffer for something else.

    Input

    test
    # test
    test # test
    test
    

    Output

    TEST
    # test
    TEST # test
    TEST
    

    Explanation

    1. h; - Save in hold buffer
    2. s/[^#]*//1; - Remove everything before #
    3. x; - Swap with hold buffer
    4. s/#.*//; - Remove the comment
    5. s/test/TEST/g; - Replace all occurences of test with TEST
    6. G; - Append newline + hold buffer (the comment)
    7. s/(.*)\n/\1/ - Remove the last newline

    The -r switch is required for using \1.

提交回复
热议问题