appsettings.json

指定行号,精确查找

格式:sed -n ‘lp’ file
参数:-n 表示行号,l表示具体的行号,p表示显示

  1. # 查找第三行文件,
  2. sed -n '3p' messages
  3. # 查找最后一行
  4. sed -n '$p' messages

指定行号的范围查找

  1. # 查找1-5行
  2. sed -n '1,5p' messages
  3. # 查找3行到最后一行
  4. sed -n '3,$p' messages

使用正则查找

使用扩展正表达式,需要加上-r

  1. # regex 正则表达式
  2. sed -n '/regex/p' messages
  3. # 统计空行
  4. sed -nr '/^$/p' messages | wc -l

使用正则查找一个范围

  1. # 查找regex1到regex2的内容
  2. # 若regex1找不到,则最后的结果是空
  3. # 若regex2找不到,则从regex1开始,一直到最后都是查找的内容
  4. sed -n '/regex1/,/regex2/p' messages

行号和正则混合使用

# 从第10行开始,查找到regex
sed -n '10,/regex/p' messages
# 从regex开始,查找到1000行
sed -n '/regex/,1000p' messages
# 从regex开始,查找接下来的n行
sed -n 'regex/,+np' messages
➜  Desktop sed -n -r '/ConnectionStrings/,+3p' appsettings.json
    "ConnectionStrings": {
        "Mongo": "mongodb://localhost:27017/windsom",
        "Influx": "http://localhost:8086/windsom"
    },

输出奇偶行,n表示读入下一行

# 输出奇数行
➜  Desktop sed -n 'p;n' appsettings.json
{
    "ConnectionStrings": {
        "Influx": "http://localhost:8086/windsom"
    "Extensions": {
            "Synchronizer": {
                "Interval": 5,
            }
    }

 # 输出偶数行
➜  Desktop sed -n 'n;p' appsettings.json
    "BinaryBase": "M:\\binary\\windsom",
        "Mongo": "mongodb://localhost:27017/windsom",
    },
        "MHCC.XSOM.WebService.MDC": {
                "Enabled": true,
                "PageSize": 5
        }
}

  # 输出某行之后的偶数行
➜  Desktop sed -n '6,${n;p}' appsettings.json
    "Extensions": {
            "Synchronizer": {
                "Interval": 5,
            }
    }

输出文本的总行数

➜  Desktop sed -n '$=' appsettings.json
17

用法和p一致,但是不需要加上-n参数
格式:

格式:sed ‘lc|a|i content’ file

参数 含义
l 行数
c 替换一行
a 在某一行后追加一行
i 在某一行前增加一行

替换一行

# 将第三行替换成了content
sed '3c content' messages

增加一行

# 在第三行后增加一行content
sed '3a content' messages
# 在第三行前增加一行content
sed '3i content' messages

注:也可以使用类似查的正则表达式

格式:sed s#old#new#g file
参数:

  1. s是表示修改模式
  2. : 可以使用任意字符表示,常用的是/、#、@

  3. old是需要被替换的内容,new是替换的内容
  4. g是表示全局替换,是指一行内的全局,如果没有g,则修改每行第一次匹配的内容 ```bash

    把每行的数字替换成空,即删除每行的数字

    ➜ Desktop echo ‘shell123abc’ | sed ‘s/[0-9]//g’ shellabc

删除第一个数字

➜ Desktop echo ‘shell123abc’ | sed ‘s/[0-9]//‘ shell23abc

删除第二个数字

➜ Desktop echo ‘shell123abc’ | sed ‘s/[0-9]//2’ shell13abc

<a name="k0X1N"></a>
#### 根据行号的范围进行修改
```bash
➜  Desktop sed '2,5s#windsom#xsom#' appsettings.json
{
    "BinaryBase": "M:\\binary\\xsom",
    "ConnectionStrings": {
        "Mongo": "mongodb://localhost:27017/xsom",
        "Influx": "http://localhost:8086/xsom"
    },
    "Extensions": {
        "MHCC.XSOM.WebService.MDC": {
            "Synchronizer": {
                "Enabled": true,
                "Interval": 5,
                "PageSize": 5
            }
        }
    }
}

根据正则匹配范围

➜  Desktop sed '/"ConnectionStrings":/,/"Extensions":/s#windsom#xsom#' appsettings.json
{
    "BinaryBase": "M:\\binary\\windsom",
    "ConnectionStrings": {
        "Mongo": "mongodb://localhost:27017/xsom",
        "Influx": "http://localhost:8086/xsom"
    },
    "Extensions": {
        "MHCC.XSOM.WebService.MDC": {
            "Synchronizer": {
                "Enabled": true,
                "Interval": 5,
                "PageSize": 5
            }
        }
    }
}

将首字母转成大写

➜  Desktop echo 'shell' | sed 's/^./\U&/g'
Shell

将首字母转成小写

➜  Desktop echo 'Shell' | sed 's/^./\L&/g'
shell

sed 反向(后向)引用

重点:是将()的个数按照顺序取出,从1开始

案例1: 调换两个单词的位置
# 将dotnet_xsom转成xsom_dotnet
echo 'dotnet_xsom' | sed -r 's/(.*)_(.*)/\2_\1/g'

案例2: 使用-e参数后面接表达式,使用多个,这样就能达到多条件匹配
➜  Desktop sed -r -e 's#("BinaryBase": ").*windsom(.*)#\1/var/opt/xsom\2#' -e '/"ConnectionStrings":/,/"Extensions":/s#windsom#xsom#' appsettings.json
{
    "BinaryBase": "/var/opt/xsom",
    "ConnectionStrings": {
        "Mongo": "mongodb://localhost:27017/xsom",
        "Influx": "http://localhost:8086/xsom"
    },
    "Extensions": {
        "MHCC.XSOM.WebService.MDC": {
            "Synchronizer": {
                "Enabled": true,
                "Interval": 5,
                "PageSize": 5
            }
        }
    }
}

案例3: 使用—debug参数进入debug模式

在debug模式下,可以发现使用-e进行多条件匹配时并行匹配

➜  Desktop sed --debug -r -e 's#("BinaryBase":.*)windsom(.*)#\1xsom\2#' -e 's#("Mongo":.*)windsom(.*)#\1xsom\2#' -e 's#("Influx":.*)windsom(.*)#\1xsom\2#' appsettings.json
SED PROGRAM:
  s/("BinaryBase":.*)windsom(.*)/\1xsom\2/
  s/("Mongo":.*)windsom(.*)/\1xsom\2/
  s/("Influx":.*)windsom(.*)/\1xsom\2/
INPUT:   'appsettings.json' line 1
PATTERN: {\r
COMMAND: s/("BinaryBase":.*)windsom(.*)/\1xsom\2/
PATTERN: {\r
COMMAND: s/("Mongo":.*)windsom(.*)/\1xsom\2/
PATTERN: {\r
COMMAND: s/("Influx":.*)windsom(.*)/\1xsom\2/
PATTERN: {\r
END-OF-CYCLE:
{
INPUT:   'appsettings.json' line 2
PATTERN:     "BinaryBase": "M:\\\\binary\\\\windsom",\r
COMMAND: s/("BinaryBase":.*)windsom(.*)/\1xsom\2/
MATCHED REGEX REGISTERS
' regex[0] = 4-41 '"BinaryBase": "M:\\binary\\windsom",
  regex[1] = 4-31 '"BinaryBase": "M:\\binary\\'
' regex[2] = 38-41 '",
PATTERN:     "BinaryBase": "M:\\\\binary\\\\xsom",\r
COMMAND: s/("Mongo":.*)windsom(.*)/\1xsom\2/
PATTERN:     "BinaryBase": "M:\\\\binary\\\\xsom",\r
COMMAND: s/("Influx":.*)windsom(.*)/\1xsom\2/
PATTERN:     "BinaryBase": "M:\\\\binary\\\\xsom",\r
END-OF-CYCLE:
    "BinaryBase": "M:\\binary\\xsom",
INPUT:   'appsettings.json' line 3
PATTERN:     "ConnectionStrings": {\r
COMMAND: s/("BinaryBase":.*)windsom(.*)/\1xsom\2/
PATTERN:     "ConnectionStrings": {\r
COMMAND: s/("Mongo":.*)windsom(.*)/\1xsom\2/
PATTERN:     "ConnectionStrings": {\r
COMMAND: s/("Influx":.*)windsom(.*)/\1xsom\2/
PATTERN:     "ConnectionStrings": {\r
END-OF-CYCLE:
    "ConnectionStrings": {
INPUT:   'appsettings.json' line 4
PATTERN:     \t"Mongo": "mongodb://localhost:27017/windsom",\r
COMMAND: s/("BinaryBase":.*)windsom(.*)/\1xsom\2/
PATTERN:     \t"Mongo": "mongodb://localhost:27017/windsom",\r
COMMAND: s/("Mongo":.*)windsom(.*)/\1xsom\2/
MATCHED REGEX REGISTERS
' regex[0] = 5-51 '"Mongo": "mongodb://localhost:27017/windsom",
  regex[1] = 5-41 '"Mongo": "mongodb://localhost:27017/'
' regex[2] = 48-51 '",
PATTERN:     \t"Mongo": "mongodb://localhost:27017/xsom",\r
COMMAND: s/("Influx":.*)windsom(.*)/\1xsom\2/
PATTERN:     \t"Mongo": "mongodb://localhost:27017/xsom",\r
END-OF-CYCLE:
        "Mongo": "mongodb://localhost:27017/xsom",
INPUT:   'appsettings.json' line 5
PATTERN:     \t"Influx": "http://localhost:8086/windsom"\r
COMMAND: s/("BinaryBase":.*)windsom(.*)/\1xsom\2/
PATTERN:     \t"Influx": "http://localhost:8086/windsom"\r
COMMAND: s/("Mongo":.*)windsom(.*)/\1xsom\2/
PATTERN:     \t"Influx": "http://localhost:8086/windsom"\r
COMMAND: s/("Influx":.*)windsom(.*)/\1xsom\2/
MATCHED REGEX REGISTERS
' regex[0] = 5-47 '"Influx": "http://localhost:8086/windsom"
  regex[1] = 5-38 '"Influx": "http://localhost:8086/'
' regex[2] = 45-47 '"
PATTERN:     \t"Influx": "http://localhost:8086/xsom"\r
END-OF-CYCLE:
        "Influx": "http://localhost:8086/xsom"
INPUT:   'appsettings.json' line 6
PATTERN:     },\r
COMMAND: s/("BinaryBase":.*)windsom(.*)/\1xsom\2/
PATTERN:     },\r
COMMAND: s/("Mongo":.*)windsom(.*)/\1xsom\2/
PATTERN:     },\r
COMMAND: s/("Influx":.*)windsom(.*)/\1xsom\2/
PATTERN:     },\r
END-OF-CYCLE:
    },
INPUT:   'appsettings.json' line 7
PATTERN:     "Extensions": {\r
COMMAND: s/("BinaryBase":.*)windsom(.*)/\1xsom\2/
PATTERN:     "Extensions": {\r
COMMAND: s/("Mongo":.*)windsom(.*)/\1xsom\2/
PATTERN:     "Extensions": {\r
COMMAND: s/("Influx":.*)windsom(.*)/\1xsom\2/
PATTERN:     "Extensions": {\r
END-OF-CYCLE:
    "Extensions": {

使用-i进行文本修改
➜  Desktop sed -i -r -e 's#("BinaryBase":.*)windsom(.*)#\1xsom\2#' -e 's#("Mongo":.*)windsom(.*)#\1xsom\2#' -e 's#("Influx":.*)windsom(.*)#\1xsom\2#' appsettings.json
➜  Desktop cat appsettings.json
{
    "BinaryBase": "M:\\binary\\xsom",
    "ConnectionStrings": {
        "Mongo": "mongodb://localhost:27017/xsom",
        "Influx": "http://localhost:8086/xsom"
    },
    "Extensions": {
        "MHCC.XSOM.WebService.MDC": {
            "Synchronizer": {
                "Enabled": true,
                "Interval": 5,
                "PageSize": 5
            }
        }
    }
}