Sed

帶有字元類的 Sed[:space:[:sp一種C和:^[:space:] 沒有得到認可

  • September 18, 2018

我使用以下sed字元類[^[:space:]]如下:

orig="(\`\`\`)([^[:space:]]*)"; 
new="\1{.\2 .numberLines startFrom=\"1\" .lineAnchors}"; 
sed -i -r -e "s|${orig}|${new}|g" ${InterimFilePath} ; 

輸入:

```bash
ls

輸出:
ls
```{.bash .numberLines startFrom="1" .lineAnchors}

預期輸出:

```{.bash .numberLines startFrom="1" .lineAnchors}
ls

有什麼建議麼?我也嘗試了字元類`[[:alnum:]]`,但結果與上面相同。

我用 GNUsedsedOpenBSD 上的本機得到的輸出是

```{.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”

引用自:https://unix.stackexchange.com/questions/469793