有沒有辦法在 bash 中選擇性地洗掉字串中的空格?例如
hello world你好 世界!
hello world你 好 世 界!
hello world 你 好 世 界!
你 好 世 界 hello world
和輸出:
hello world你好世界!
你好世界hello world
請注意,我想保留英文單詞或英文字母之間的空格,而不是其他單詞。
我知道python.re模塊可能對此有好處,但如果可能,我更喜歡 bash 命令。
uj5u.com熱心網友回復:
您可以使用 sed:
echo hello world你好 世界! | sed -E "s/([^a-zA-Z]) ([^a-zA-Z])/\1\2/g"
([^a-zA-Z]) ([^a-zA-Z])是匹配兩個非拉丁字符(^否定)之間的空格的正則運算式。前面和后面的字符按組捕獲(#1 和 #2)\1\2是替換字串(只有中間沒有空格的組)
輸出:
hello world你好世界!
注意:要替換開頭和結尾的空格,您的運算式應該是:
(^|[^a-zA-Z]) ([^a-zA-Z]|$)
編輯:我沒有考慮到的一件事是這種運算式消耗了空格前后的字符。所以在這種情況下你 好 世 界 hello world,空白仍然存在。然后,您必須使用支持環視的正則運算式引擎:
echo " 你 好 世 界 hello world, !" | perl -pe "s/(?<=^|[^[:ascii:]]) | (?=[^[:ascii:]]|$)//g"
輸出:
你好世界hello world
為了去除拉丁字符/kandji 之間的空格,我將運算式一分為二。我還用 ascii 替換了拉丁字符的條件。應該給出更合適的匹配
uj5u.com熱心網友回復:
perl使用 Unicode 屬性的解決方案(特別是,如果字符在或不在拉丁腳本中:
$ perl -CSD -lpe 's/^\s //; # Remove leading spaces
s/\s $//; # Remove trailing spaces
# Remove spaces between two non-latin characters.
s/(\P{scx=Latin})\s (?=\P{scx=Latin})/$1/g;
# Remove spaces between a leading latin and trailing non-latin
s/(\p{scx=Latin})\s (?=\P{scx=Latin})/$1/g;
# Remove spaces between a leading non-latin and trailing latin
s/(\P{scx=Latin})\s (?=\p{scx=Latin})/$1/g;' input.txt
hello world你好世界!
hello world你好世界!
hello world你好世界!
你好世界hello world
它為您想要洗掉空格而不是嘗試使用單個正則運算式來匹配每種可能性的不同情況進行了大量替換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/333622.html
標籤:猛击
