带有字符类 [^[:space:]] 的 Sed 未被识别

带有字符类 [^[:space:]] 的 Sed 未被识别

我使用以下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
```
  • 使用+代替*, 因为*会匹配所有内容。

相关内容