What GNU/Linux command-line tool would I use for performing a search and replace on a file?

后端 未结 4 2075
南方客
南方客 2021-02-07 00:10

What GNU/Linux command-line tool would I use for performing a search and replace on a file?

Can the search text, and replacement, be specified in a regex format?

相关标签:
4条回答
  • 2021-02-07 00:34

    sed, the stream editor, and yes, it uses regex.

    0 讨论(0)
  • 2021-02-07 00:36

    Perl was invented for this:

    perl -pi -e 's/foo/bar/g;' *.txt
    

    Any normal s/// pattern in those single quotes. You can keep a backup with something like this:

    perl -pi.bak -e 's/foo/bar/g;' *.txt
    

    Or pipeline:

    cat file.txt | perl -ne 's/foo/bar/g;' | less
    

    But that's really more sed's job.

    0 讨论(0)
  • 2021-02-07 00:37
    sed 's/a.*b/xyz/g;' old_file > new_file
    

    GNU sed (which you probably have) is even more versatile:

    sed -r --in-place 's/a(.*)b/x\1y/g;' your_file
    

    Here is a brief explanation of those options:

    -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied)

    -r, --regexp-extended use extended regular expressions in the script.

    The FreeBSD version also supports these options. The NetBSD and OpenBSD versions support only -r.

    If you want to learn more about sed, Cori has suggested this tutorial.

    0 讨论(0)
  • 2021-02-07 00:49

    Consider Ruby as an alternative to Perl. It stole most of Perl's one-liner commandline args (-i, -p, -l, -e, -n) and auto-sets $_ for you like Perl does and has plenty of regex goodness. Additionally Ruby's syntax may be more comfortable and easier to read or write than Perl's or sed's. (Or not, depending on your tastes.)

    ruby -pi.bak -e '$_.gsub!(/foo|bar/){|x| x.upcase}' *.txt

    vs.

    perl -pi.bak -e 's/(foo|bar)/\U\1/g' *.txt

    In many cases when dealing with one-liners, performance isn't enough of an issue to care whether you use lightweight sed or heavyweight Perl or heaveier-weight Ruby. Use whatever is easiest to write.

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