簡體   English   中英

按換行符拆分bash字符串

[英]Split bash string by newline characters

我找到了這個

我正在嘗試這個:

x='some
   thing'

y=(${x//\n/})

我沒有運氣,我認為它可以使用雙反斜杠:

y=(${x//\\n/})

但它沒有。

為了測試我沒有得到我想要的我正在做的事情:

echo ${y[1]}

獲得:

some
thing

我想成為:

some

我希望y是一個數組[some, thing] 我怎樣才能做到這一點?

其它的辦法:

x=$'Some\nstring'
readarray -t y <<<"$x"

或者,如果您沒有 bash 4,則 bash 3.2 相當於:

IFS=$'\n' read -rd '' -a y <<<"$x"

您也可以按照最初嘗試使用的方式進行操作:

y=(${x//$'\n'/ })

但是,如果您的字符串已經包含空格,例如'line 1\\nline 2' ,這將無法正常工作。 要使其工作,您需要在解析之前限制單詞分隔符:

IFS=$'\n' y=(${x//$'\n'/ })

...然后,由於您正在更改分隔符,您不再需要將\\n轉換為space ,因此您可以將其簡化為:

IFS=$'\n' y=($x)

除非$x包含匹配的通配符模式(例如“ * ”),否則此方法將起作用 - 在這種情況下,它將被匹配的文件名替換。 read / readarray方法需要較新的 bash 版本,但適用於所有情況。

如果您想要的只是第一個換行的文本,還有另一種方法:

x='some
thing'

y=${x%$'\n'*}

之后y將包含some而沒有其他內容(沒有換行符)。

這里發生了什么?

我們對第一個ANSI C 換行符( $'\\n' ) 之前的最短匹配執行 參數擴展子字符串刪除( ${PARAMETER%PATTERN} ) 並刪除后面的所有內容 ( * )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM