diff --git a/sources/tech/20220802 How I use the Linux sed command to automate file edits.md b/sources/tech/20220802 How I use the Linux sed command to automate file edits.md new file mode 100644 index 0000000000..fec2299637 --- /dev/null +++ b/sources/tech/20220802 How I use the Linux sed command to automate file edits.md @@ -0,0 +1,176 @@ +[#]: subject: "How I use the Linux sed command to automate file edits" +[#]: via: "https://opensource.com/article/22/8/automate-file-edits-sed-linux" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" +[#]: collector: "lkxed" +[#]: translator: " " +[#]: reviewer: " " +[#]: publisher: " " +[#]: url: " " + +How I use the Linux sed command to automate file edits +====== +Here are some tips and tricks to automating file edits from the Linux command line. + +![computer screen][1] + +Image by: Opensource.com + +When I use the Linux command line, whether I'm writing a new program on my desktop computer or managing a website on my web server, I often need to process text files. Linux provides powerful tools that I leverage to get my work done. I frequently use `sed`, an editor that can modify text according to a pattern. + +`sed` stands for *stream editor*, and it edits text in a file and prints the results. One way to use `sed` is to identify several occurrences of one string in a file and replace them with a different string. You can use `sed` to process text files to a seemingly endless degree, but I'd like to share a few ways I use `sed` to help me manage files. + +### Search and replace text in a file on Linux + +To use `sed`, you need to use a *regular expression*. A regular expression is a set of special characters that define a pattern. My most frequent example of using `sed` is replacing text in a file. The syntax for replacing text looks like this: `s/originaltext/newtext/`. The `s` tells sed to perform text replacement or swap occurrences of text. Provide the original text and new text between slashes. + +This syntax will only replace the first occurrence of `originaltext` on each line. To replace every occurrence, even if the original text appears more than once on a line, append `g` to the end of the expression. Here is an example: `s/originaltext/newtext/g`. + +To use this with `sed`, specify this regular expression with the `-e` option: + +``` +$ sed -e 's/originaltext/newtext/g' +``` + +For example, let's say I have a Makefile for a program called **game**, which simulates Conway's Game of Life: + +``` +.PHONY: all run clean + +all: game + +game: game.o +        $(CC) $(CFLAGS) -o game game.o $(LDFLAGS) + +run: game +        ./game + +clean: +        $(RM) *~ +        $(RM) *.o +        $(RM) game +``` + +The name **game** isn't very descriptive, so I might choose to rename it **life**. Renaming the `game.c` source file to `life.c` is easy enough, but now I need to modify the Makefile to use the new name. I can use `sed` to change every occurrence of **game** to **life**: + +``` +$ sed -e 's/game/life/g' Makefile +.PHONY: all run clean + +all: life + +life: life.o +        $(CC) $(CFLAGS) -o life life.o $(LDFLAGS) + +run: life +        ./life + +clean: +        $(RM) *~ +        $(RM) *.o +        $(RM) life +``` + +This prints the `sed` output to the screen, which is a good way to check if the text replacement will do what you want. To make these changes to the Makefile, first, make a backup of the file, then run `sed` and save the output to the original filename: + +``` +$ cp Makefile Makefile.old +$ sed -e 's/game/life/g' Makefile.old > Makefile +``` + +If you are confident that your changes are exactly what you want, use the `-i` or `--in-place` option to edit the file in place. However, I recommend adding a backup filename suffix like `--in-place=.old` to save a copy of the original file in case you need to restore it later. It looks like this: + +``` +$ sed --in-place=.old -e 's/game/life/g' Makefile +$ ls Makefile* +Makefile  Makefile.old +``` + +### Quoting files with sed on Linux + +You can use other features of regular expressions to match specific instances of text. For example, you might need to replace text that occurs at the start of a line. With `sed`, you can match the beginning of a line with **^**, the caret character. + +One way I use "start of line" in replacing text is when I need to quote a file in an email. Let's say I want to share my Makefile in an email, but I don't want to include it as a file attachment. Instead, I prefer to "quote" the file in the body of an email, using **>** before each line. I can use the following `sed` command to print out an edited version to my terminal, which I can copy and paste into a new email: + +``` +$ sed -e 's/^/>/' Makefile +>.PHONY: all run clean +> +>all: life +> +>life: life.o +>       $(CC) $(CFLAGS) -o life life.o $(LDFLAGS) +> +>run: life +>       ./life +> +>clean: +>       $(RM) *~ +>       $(RM) *.o +>       $(RM) life +``` + +The `s/^/>/` regular expression matches the start of each line (**^**) and places a **>** there. Effectively, this starts each line with the **>** symbol. + +The tabs might not show up correctly in an email, but I can replace all tabs in the Makefile with a few spaces by adding another regular expression: + +``` +$ sed -e 's/^/>/' -e 's/\t/  /g' Makefile +>.PHONY: all run clean +> +>all: life +> +>life: life.o +>  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS) +> +>run: life +>  ./life +> +>clean: +>  $(RM) *~ +>  $(RM) *.o +>  $(RM) life +``` + +The `\t` indicates a literal tab, so `s/\t/ /g` tells sed to replace all tabs in the input with two spaces in the output. + +If you need to apply lots of edits to files, you can save your `-e` commands in a file and use `-f` to tell `sed` to use that file as a "script." This approach is especially useful if you need to make the same edits frequently. I might have prepared the Makefile for quoting in email using a script file called `quotemail.sed` : + +``` +$ cat quotemail.sed +s/^/>/ +s/\t/  /g +$ sed -f quotemail.sed Makefile +>.PHONY: all run clean +> +>all: life +> +>life: life.o +>  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS) +> +>run: life +>  ./life +> +>clean: +>  $(RM) *~ +>  $(RM) *.o +>  $(RM) life +``` + +### Learn to work with sed on Linux + +`sed` is a great tool to keep in your Linux command-line toolkit. Explore the `sed` manual page and learn more about how to use it. Type `man sed` at the command line to get complete documentation about the different command line options and how to use `sed` to process text files. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/22/8/automate-file-edits-sed-linux + +作者:[Jim Hall][a] +选题:[lkxed][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jim-hall +[b]: https://github.com/lkxed +[1]: https://opensource.com/sites/default/files/lead-images/features_solutions_command_data.png