簡體   English   中英

如何在Unix Bash腳本中用新行替換“\\ n”字符串

[英]How to replace “\n” string with a new line in Unix Bash script

似乎無法在網上找到這個答案...

我有一個字符串變量(外部源),新行"\\n"編碼為字符串。

我想用實際的新行回車替換這些字符串。 下面的代碼可以達到這個目的......

echo $EXT_DESCR | sed 's/\\n/\n/g'

但是當我嘗試將結果存儲到它自己的變量中時,它會將它們轉換回字符串

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`

如何實現這一目標,或者我做錯了什么?

這是我的代碼,我一直在測試,以嘗試獲得正確的結果

EXT_DESCR="This is a text\nWith a new line"
echo $EXT_DESCR | sed 's/\\n/\n/g'

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`
echo ""
echo "$NEW_DESCR"

使用參數擴展不需要sed

$ foo='1\n2\n3'; echo "${foo//'\n'/$'\n'}"  
1
2
3

使用bash 4.4或更新版本,您可以在${parameter@operator}使用E運算${parameter@operator}

$ foo='1\n2\n3'; echo "${foo@E}"
1
2
3

其他答案包含替代解決方案 (我特別喜歡參數擴展一個。)

這是你的嘗試出了什么問題:

echo $EXT_DESCR | sed 's/\\n/\n/g'

sed命令是單引號,因此sed按原樣獲得s/\\\\n/\\n/g

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`

整個命令在反引號中,因此應用了一輪反斜杠處理。 這導致sed獲得代碼s/\\n/\\n/g ,它什么都不做。

此代碼的可能修復:

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\\\n/\\n/g'`

通過加倍反斜杠,我們在sed中得到了正確的命令。

或者(更容易):

NEW_DESCR=$(echo $EXT_DESCR | sed 's/\\n/\n/g')

而不是反引號使用$( ) ,它具有較少深奧的逃避規則。

注意:不要將ALL_UPPERCASE用於shell變量。 UPPERCASE (非正式地)保留用於系統變量,例如HOME和特殊的內置變量,例如IFSRANDOM

這個printf可以通過解釋所有轉義的構造來完成工作:

printf -v NEW_DESCR "%b" "$EXT_DESCR"

-v選項將輸出存儲在變量中,因此不需要在此處使用命令替換。

你的方法的問題是使用舊的后退。 你可以這樣做:

NEW_DESCR=$(echo "$EXT_DESCR" | sed 's/\\n/\n/g')

假設您正在使用gnu sed作為BSD sed將無法使用此方法。

具體取決於您需要它:

echo -e $EXT_DESCR

可能就是你所需要的一切。

來自echo手冊頁:

-e啟用反斜杠轉義的解釋

暫無
暫無

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

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