Bash

將所有字元替換為空格,直到它遇到第一個 /

  • September 6, 2022

這是字元串(它是 shell 變數的值):

2908104 /var/cache/yum/x86_64/7Server/Patches/gen

預期輸出:

/var/cache/yum/x86_64/7Server/Patches/gen

如何僅檢索從第一個 / 開始的值?我是 sed 的新手,只是 linux 的初學者。

通過在grep使用 Linux 作為核心的系統上常見的實現(在 RHEL 和其他通用 GNU/Linux 發行版上發現的 GNU,在大多數基於 Linux 的系統上發現的busybox,在 Android 上發現的 toybox),您可以執行以下操作:

LC_ALL=C grep -o '/.*' <input

/對於至少有一個的行,列印從第一行開始的行部分。

POSIXly:

LC_ALL=C sed -n 's|^[^/]*/|/|p' <input

如果字元串儲存在類似 POSIX 的 shell 中的 shell 變數中(比如shRHEL,它實際上bash處於 POSIX 模式)。

new_string=${string#"${string%%/*}"}

$new_string如果$string不包含任何內容將為空/

${string%%/*}刪除匹配的最長後綴/*。結果又被視為${string#pattern}刪除與該模式匹配的最短前綴的模式。在這裡,正如${string%%/*}引用的那樣,它被視為文字字元串而不是模式。

使用zsh,您還可以執行以下操作:

new_string=${(M)string%%/*}

使用M 參數擴展標誌,所有那些${string#pattern}(或##, :#, %, %%)運算符而不是刪除匹配部分,而是擴展到M附加部分(沒有它會被刪除的部分)。

您還可以刪除所有前導非/字元:

  • zsh
set -o extendedglob
new_string=${string##[^/]#}
  • ksh93/ bash -O extglob:
new_string=${string##*([^/])}

其中X#(zsh) 或*(X)(ksh) 匹配 0 個或多個Xs,相當於X*grepsed上面使用的正則表達式。


¹ 通​​常嵌入在您的智能燈泡或電視或網路設備中,因此最終使用者很少與他們的外殼和實用程序進行互動。

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