我使用以下sed
字符类,[^[:space:]]
如下所示:
orig="(\`\`\`)([^[:space:]]*)";
new="\1{.\2 .numberLines startFrom=\"1\" .lineAnchors}";
sed -i -r -e "s|${orig}|${new}|g" ${InterimFilePath} ;
输入:
```bash
ls
```
输出:
```{.bash .numberLines startFrom="1" .lineAnchors}
ls
```{.bash .numberLines startFrom="1" .lineAnchors}
预期输出:
```{.bash .numberLines startFrom="1" .lineAnchors}
ls
```
有什么建议么?我也尝试了字符类[[:alnum:]]
,但结果与上面相同。
答案1
sed
我使用 GNU和 OpenBSD 上的本机得到的输出sed
是
```{.bash .numberLines startFrom="1" .lineAnchors}
ls
```{. .numberLines startFrom="1" .lineAnchors}
这是因为你的表情匹配零三个反引号后有一个或多个非空格字符。更改[^[:space:]]*
为[^[:space:]]+
将强制匹配最后一个非空格字符。
这给出了预期输出
```{.bash .numberLines startFrom="1" .lineAnchors}
ls
```
您还可以在变量赋值中使用单引号。这使得字符串看起来更整洁,而不需要转义特殊字符来保护它们免受 shell 的影响:
orig='(```)([^[:space:]]+)'
new='\1{.\2 .numberLines startFrom="1" .lineAnchors}'
sed -i -E "s|$orig|$new|g" "$InterimFilePath"
答案2
尝试这个,
orig="(\`\`\`)([[:alnum:]]+)";
new="\1{.\2 .numberLines startFrom=\"1\" .lineAnchors}";
sed -i -r -e "s|${orig}|${new}|g" ${InterimFilePath} ;
输出
```{.bash .numberLines startFrom="1" .lineAnchors}
ls
```
- 使用
+
代替*
, 因为*
会匹配所有内容。