Bash

使用 sed 對 bash 中的變數進行文本處理沒有給出預期的(修改後的)輸出?

  • November 7, 2019

我們正在使用一些不允許修改的過時編碼腳本。因此,我想到了一個使用 sed 自動修改輸入的解決方案。這沒有用,在論壇上探勘之後,我想出了下面的“解決方案”,但是它不起作用。那個或輸出沒有按預期修改。

我想達到什麼目的?

有兩種輸入(所以我需要兩個單獨的規則/腳本)。一種是每四 (4) 個字元之間加一個減號,另一種是每六 (6) 個字元之間加一個減號。

範例 1 輸入:

0HU1L1LQXRFF2W8146LXX5WL

需要格式化為:

0HU1-L1LQ-XRFF-2W81-46XX-L5WL

範例 2 輸入:

C00W00M9JN0777XT06XJHFGCM7Y195

需要格式化為:

C00W00-M9JN07-77XT06-XJHFGC-M7Y195

基於上述內容,我將需要兩個單獨的規則,這對我來說不是問題。

那麼到目前為止我嘗試了什麼?

在這里和其他論壇上探勘之後,我發現以下命令適用於這兩種情況:

例如1:

echo "0HU1L1LQXRFF2W8146LXX5WL" | fold -w4 | paste -sd'-' -
Result: 0HU1-L1LQ-XRFF-2W81-46XX-L5WL

完美的!

例如2:

echo "C00W00M9JN0777XT06XJHFGCM7Y195" | fold -w6 | paste -sd'-' -
Result: C00W00-M9JN07-77XT06-XJHFGC-M7Y195

也很完美!

然而…

我很難將其轉換為基於變數的 bash 腳本。我嘗試了以下方法:

#!/bin/sh
example=C00W00M9JN0777XT06XJHFGCM7Y195
echo "Unedited:"
echo $example
echo " "
echo "Modified:"
stripped=($example | fold -w6 | paste -sd'-' -)
echo $stripped

有了上述內容,我收到以下錯誤:意外標記’|‘附近的語法錯誤

所以我通過轉義’|‘來修改它 像這樣:

example=C00W00M9JN0777XT06XJHFGCM7Y195
echo "Unedited:"
echo $example
echo " "
echo "Modified:"
stripped=($example \| fold -w6 \| paste -sd'-' -)
echo $stripped

我沒有收到上述任何錯誤,但它沒有按應有的方式工作。兩個結果是相同的,或者更好地說 $stripped 之間沒有減號 (-) 符號。

也許有人可以很好地告訴我我在這裡做錯了什麼以及如何解決這個問題?

作為記錄; 我不需要在 4 和 6 個字元之間添加減號 (-) 符號的“組合”腳本。只是其中一個,我會把它翻譯成另一個顯而易見的。

預先感謝您。

在您的測試中,您曾經echo將值發送到標準輸出,然後是管道,但您在腳本中忽略了它。您還需要一個額外的$來使其成為命令替換。

stripped=$(echo $example | fold -w6 | paste -sd'-' -)

會給出想要的結果。

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