sed command in dry run

后端 未结 3 1386
情深已故
情深已故 2021-02-02 05:51

How it is possible to make a dry run with sed?

I have this command:

find ./ -type f | xargs sed -i \'s/string1/string2/g\'

3条回答
  •  孤独总比滥情好
    2021-02-02 06:23

    I know this is a very old thread and the OP doesn't really need this answer, but I came here looking for a dry run mode myself, so thought of adding the below piece of advice for anyone coming here in future. What I wanted to do was to avoid stomping the backup file unless there is something really changing. If you blindly run sed using the -i option with backup suffix, existing backup file gets overwritten, even when there is nothing substituted.

    The way I ended up doing is to pipe sed output to diff and see if anything changed and then rerun sed with in-place update option, something like this:

    if ! sed -e 's/string1/string2/g' $fpath | diff -q $fpath - > /dev/null 2>&1; then
        sed -i.bak -e 's/string1/string2/g' $fpath
    fi
    

    As per OP's question, if the requirement is to just see what would change, then instead of running the in-pace sed, you could do the diff again with some informative messages:

    if ! sed -e 's/string1/string2/g' $fpath | diff -q $fpath - > /dev/null 2>&1; then
        echo "File $fpath will change with the below diff:"
        sed -e 's/string1/string2/g' $fpath | diff $fpath -
    fi
    

    You could also capture the output in a variable to avoid doing it twice:

    diff=$(sed -e 's/string1/string2/g' $fpath | diff $fpath -)
    if [[ $? -ne 0 ]]; then
        echo "File $fpath will change with the below diff:"
        echo "$diff"
    fi
    

提交回复
热议问题