Linux命令行 - sed

  • -e,不写入文件
  • -i,写入文件
  • s,替换

    • s/xxx/yyy/g
    • s;xxx;yyy;
  • 所有 subdir.mk 替换 “$(CC) $(BUILD_CFLAGS)” 为 “$(CC) $(BUILD_CFLAGS) -fPIC”,find . -name "subdir.mk" -exec sed -i 's;$(CC) $(BUILD_CFLAGS);$(CC) $(BUILD_CFLAGS) -fPIC;' '{}' \;

  • 使用 find 结果替换时,加个 -type f,只处理 regular file,否则处理完后,可能有文件类型发生变动,git status 有 typechange: your_file
  • 所有 .c 文件首行添加 “#include <asm-generic/io.h>”,find . -name "*.c" -exec sed -i '1 i#include <asm-generic/io.h>' "{}" \;
  • 行首,行尾加字符,例如 # 号:s/^/\#/gs/$/\#/g
  • sed 替换匹配行的某个字符,例如还是行首加 # 号:sed -i '/your_pattern/s/^/\#/g'
  • sed 匹配多个字符串,sed -n '/hello\|world/p''/hello/p; /world/p'
  • 完全匹配字符串,\<your_world\>

问题汇总

记录一次二次展开的惨案

人生苦短,请用 Python…sb 了,这个搞了一个晚上,刚才才想起来,要用 ;

1
2
3
4
jeromesun@km:~/workshop/bash$ echo "abcdefghijk" | sed "s/abcd/fghi`pwd`/"
sed: -e expression #1, char 13: unknown option to `s'
jeromesun@km:~/workshop/bash$ echo "abcdefghijk" | sed "s;abcd;fghi`pwd`;"
fghi/home/jeromesun/workshop/bashefghijk