Bash

如何從 bash 的最後一個參數中刪除換行符?

  • May 10, 2020

我正在研究 wsl bash,我在我的~/.bashrc文件中定義了以下函式:

function clip { /mnt/c/Windows/System32/clip.exe "${@%\n}"; }

但是,這不會\n從參數中刪除尾隨。我怎樣才能改進它以滿足我的特定需求?

非常感謝

編輯:在Kamil的回答的幫助下,我能夠弄清楚實際發生了什麼。事實證明,生成的子程序(cmd.exe)正在添加正在插入的輸入clip.exe(因為我使用的是管道。例如pwd | clip)。

我能夠通過以下方式獲得所需的結果:

function clip { /mnt/c/Windows/System32/WindowsPowershell/v1.0/powershell.exe Set-Clipboard "${@:-$(cat)}"; }

它有點慢,因為它依賴於

  • 電源外殼
  • cat(外部二進製文件,應替換為 read builtin)

但對我的需求來說不是問題:)

"${@%\n}"刪除尾隨n. "${@%\\n}"將刪除尾隨\n(文字字元串,而不是換行符)。

要刪除換行符,您需要傳遞換行符。在 Bash 中,這種語法應該可以工作:

"${@%$'\n'}"

where$'\n'負責生成實際的換行符。文字換行符也可以:

"${@%
}"

筆記:

  • 該解決方案從每個參數中刪除尾隨換行符,而不僅僅是從最後一個參數中刪除(因為這是$@工作原理)。
  • 在 Linux 中,在命令行參數中有一個尾隨換行符是不尋常的。我不知道WSL,我不知道你的案例;我希望你知道你想要什麼* .

例子:

$ set a $'b\n' c
$ printf '<%s>\n' "$@"
<a>
<b
>
<c>
$ printf '<%s>\n' "${@%$'\n'}"
<a>
<b>
<c>
$ printf '<%s>\n' "${@%
}"
<a>
<b>
<c>

  • 如果“從參數中刪除尾隨\n”不是您想要的,那麼也許您在(來源?)腳本中呼叫該函式並且該腳本遭受 DOS 行結尾的影響。檢查這個問題

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