2014-04-03 23 views
1

標題說明了這一切。我試圖建立一個正則表達式,但是失敗的可悲。任務是返回不匹配'禁止'常量字符串的逗號分隔列表中的第一個字符串。 '禁止'字符串可以出現在列表中的任何地方,並且(理論上)可以在列表中多次出現。正則表達式 - 在逗號分隔列表中找到第一個不匹配常量字符串的值

例如(當「禁止」字符串=「TBD」):

"TBD,Smith" --> need to return Smith 
"TBD,TBD,TBD,Jones,Edwards" --> need to return Jones 
"ABC,TBD,Smith" --> need to return ABC 
"TBD,DEF-9gh,GHI,JKLMNOpqrst,Any old string" --> need to return DEF-9gh 

任何正則表達式的忍者在那裏誰知道如何做到這一點?

+0

_Failing悲慘..._ - 你可以張貼的例子嗎? – devnull

+0

什麼定義「禁止」? 3個大寫字母? – Bohemian

+0

不,字符串待定。也可能是被禁止的字符串根本不會發生... eg1:ABC - >返回ABC .... eg2:ABC,DEF - >返回ABC – user2301506

回答

2

使用grep -P

s="ABC,TBD,Smith" 
echo "$s"|grep -oP '(^|,)\K(?!TBD)[^,]+'|head -1 
ABC 

s="TBD,TBD,TBD,Jones,Edwards" 
echo "$s"|grep -oP '(^|,)\K(?!TBD)[^,]+'|head -1 
Jones 

s="TBD,DEF-9gh,GHI,JKLMNOpqrst,Any old string" 
echo "$s"|ggrep -oP '(^|,)\K(?!TBD)[^,]+'|head -1 
DEF-9gh 

如果你的grep不支持-P那麼這裏是一個AWK解決方案

echo "$s" | awk -F '(TBD,)*|,' '{print $1$2; exit}' 
DEF-9gh 
0

難道我明白你的問題是否正確?

awk

$ awk -F',' '{for(i=1;i<=NF;i++){if($i!="TBD"){print $i;next}}}' input.txt 
Smith 
Jones 
ABC 
DEF-9gh 

甲符合POSIX的殼溶液:

$ cat t.sh 
#!/bin/sh 

while read -r line; do 
     IFS=, 
     for token in ${line}; do 
       if [ "${token}" != TBD ]; then 
         echo "${token}" 
         continue 2 
       fi 
     done 
done <<EOT 
TBD,Smith 
TBD,TBD,TBD,Jones,Edwards 
ABC,TBD,Smith 
TBD,DEF-9gh,GHI,JKLMNOpqrst,Any old string 
EOT 

$ ./t.sh 
Smith 
Jones 
ABC 
DEF-9gh 

或只是

get_token() 
(
    IFS=, 
    for t in [email protected]; do 
     [ "$t" != TBD ] && echo "$t" && break 
    done 
) 

get_token "TBD,TBD,TBD,Jones,Edwards" # => "Jones" 
相關問題