簡體   English   中英

通過用sed剪切最后一列獲得意外結果

[英]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包含shome則不包含,因此后者與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.

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