全部替换比较容易,只替换一次比较难,没有例子可能搞半天都搞不出来,tips: 如果匹配表达式有问题可以使用p这个选项调试。
一、使用正则表达式搜索文件的内容,把所有的匹配项全部替成的新的字符串
有一个文件名叫file.json, 把里面的"digest": "10002000" 或者"digest": "30004000" 之类的值全部替换成"digest": "ffffffff"
sed -i -E 's/\"digest\"\:[[:space:]]+.*/"digest": "ffffffff"/' file.json
这句命令使用了 sed 工具,目的是在文件 file.json 中进行文本替换。解释一下每个部分的含义:
sed: 是一个流编辑器,用于对文本进行处理,通常用于文本替换、删除、过滤等操作。
-i: 是 sed 命令的选项之一,表示直接修改文件而不是在标准输出中显示结果。当使用 -i 选项时,sed 将会直接修改指定的文件,而不是将结果输出到屏幕。
-E: 是 sed 命令的另一个选项,用于启用扩展正则表达式的支持。使用了 -E 选项后,可以在 sed 命令中使用更加灵活的正则表达式语法。
's/\"digest\"\:[[:space:]]+.*/"digest": "ffffffff"/': 这是 sed 命令中的具体操作部分,它包含了多个部分:
s: 这是一个替换命令,用于指定要进行的操作类型,这里 s 表示替换。
\"digest\"\:[[:space:]]+.*/: 这是一个正则表达式模式,用于匹配要被替换的内容。具体来说:
\"digest\": 匹配字符串 "digest"。
\:: 匹配冒号 :。在正则表达式中,冒号是特殊字符,需要使用反斜杠进行转义。
[[:space:]]+: 匹配一个或多个空白字符。[[:space:]] 是一个 POSIX 字符类,表示空白字符,包括空格、制表符等。
.*: 匹配零个或多个任意字符。
`"digest": "
"digest": "ffffffff" 是替换模式的一部分,表示要将匹配到的内容替换为 "digest": "ffffffff"。所以这个命令的作用是在文件中查找包含 "digest": 的行,将其中的内容替换为 "digest": "ffffffff"。
二、使用正则表达式搜索文件的内容,只把第一个匹配项替成的新的字符串,比如搜索到文件中有10个"digest":"xxxxxxxx"的行,只修改替换第一个,其他9个不变。
sed -i -E '1,/\"digest\"\:[[:space:]]+.*/s/\"digest\"\:[[:space:]]+.*/"digest": "ffffffff"/g' file.json
现在来解释具体操作部分:
'1,/\"digest\"\:[[:space:]]+.*/s/\"digest\"\:[[:space:]]+.*/"digest": "ffffffff"/g': 这部分较为复杂,但我们一步一步解释它。
1,/\"digest\"\:[[:space:]]+.*/: 这是一个地址范围,它指定了替换操作的范围。具体解释如下:
1: 表示从第一行开始。
,: 是地址范围中两个地址的分隔符。
/\"digest\"\:[[:space:]]+.*/: 这是第二个地址,它是一个正则表达式模式,用于匹配要替换的行。具体来说:
\"digest\": 匹配字符串 "digest"。
\:: 匹配冒号 :。
[[:space:]]+: 匹配一个或多个空白字符。
.*: 匹配零个或多个任意字符。这里的意思是匹配包含 "digest": 的行。
s/\"digest\"\:[[:space:]]+.*/"digest": "ffffffff"/g: 这是一个替换命令,它用于在指定范围内进行替换。具体解释如下:
s: 这是替换命令的开始。
\"digest\"\:[[:space:]]+.*/: 这是替换命令的匹配模式,与前面的地址范围中的模式相同,用于匹配要被替换的内容。
"digest": "ffffffff": 这是替换命令的替换内容,表示要将匹配到的内容替换为 "digest": "ffffffff"。
g: 这是替换命令的标志,表示进行全局替换,即替换所有匹配到的内容。