[英]Sed expression for IP address, getting unexpected result for matching group
[英]unexpected result by cutting the last column with sed
echo '60 test' | sed -r 's/(.*)\s+[^\s]+$/\1/'
結果:
60測試
最后一列不刪減。 但它與
echo '60 home' | sed -r 's/(.*)\s+[^\s]+$/\1/'
結果:
60
為什么?
[^\\s]+
表示not backslash or s repeated 1 or more times
並且test
包含s
而home
則不包含,因此后者與regexp匹配,而前者則不匹配。
您應該使用以下任一方法來匹配非空格:
$ echo '60 test' | sed -r 's/(.*)\s+\S+$/\1/'
60
$ echo '60 test' | sed -r 's/(.*)\s+[^[:space:]]+$/\1/'
60
正如@potong在評論中建議的那樣,要刪除帶有sed的最后一列,您真正需要的是:
sed -E 's/\s+\S+$//'
我從-r
切換到-E
因為-r
僅當-E
是GNU或OSX / BSD sed時,因此使用BUT OSX / BSD sed通常不會識別\\s
或\\S
是更好的選擇,因此從在這種情況下, -r
到-E
並不能使腳本更具可移植性,您必須使用以下代碼:
sed -E 's/[[:space:]]+[^[:space:]]+//'
然后要完全移植到所有POSIX sed中,它將是:
sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}//'
否則,如果總是有2個或更多字段,則其行為相同:
sed 's/[[:space:]]*[^[:space:]]*//'
如果您只是在空格之前打印字符串的第一部分而不進行任何其他修改,則可以簡單地使用cut
echo '60 test' | cut -d' ' -f1
60
您在其中定義定界符(-d)和要選擇的字段(-f)。 無需使用sed
進行復雜的解決方案並執行一些替換操作。
使用awk
您還可以打印第一個字段:
echo '60 test' | awk '{print $1}'
60
或在perl模式下通過grep
將\\s
考慮在內
echo '60 test' | grep -oP '^.*?(?=\s)'
60
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.