首頁>Program>source

我有一个包含许多單詞的字元串,每两个單詞之間至少有一个空格.如何將字元串分成單个單詞,以便遍歷它们?

该字元串作為引數傳遞.例如. ${2} == "cat cat file" .我该如何遍歷它?

此外,我如何檢查字元串是否包含空格?

最新回復
  • 5月前
    1 #

    您是否尝試過仅將字元串變數傳遞给 for 迴圈? Bash中的一个会自動在空白處分割。

    sentence="This is   a sentence."
    for word in $sentence
    do
        echo $word
    done
    
    This
    is
    a
    sentence.
    

  • 5月前
    2 #

    我類似轉換為陣列,以便能够訪問各个元素:

    sentence="this is a story"
    stringarray=($sentence)
    

    現在您可以直接訪問各个元素(以0開頭):

    echo ${stringarray[0]}
    

    或轉換迴字元串以迴圈:

    for i in "${stringarray[@]}"
    do
      :
      # do whatever on $i
    done
    

    当然,直接在字元串中迴圈是之前迴答的,但是该迴答的缺點是無法跟蹤各个元素供以後使用:

    for i in $sentence
    do
      :
      # do whatever on $i
    done
    

    另請參阅Bash陣列參考。

  • 5月前
    3 #

    只需使用內建的"設置"壳.例如,

     設置$ text
    

    在那之後,$ text中的單个單詞將分別在$ 1,$ 2,$ 3等中。出於鲁棒性,通常這樣做

     設置-垃圾$ text
     轉移
    

    處理$ text為空或以破折號開頭的情况.例如:

     text =" This is a test"
     設置-垃圾$ text
     轉移
     言語 做
      迴声" [$ word]"
     完成
    

    此print

     [這个]
     [是]
     [一種]
     [測試]
    

  • 5月前
    4 #

    在BASH 3及更高版本中,最簡單,最安全的方法可能是:

    var="string    to  split"
    read -ra arr <<<"$var"
    

    (其中 arr 是采用字元串分割部分的陣列),或者,如果輸入中可能包含換行符,而您需要的不仅仅是第一行:

    var="string    to  split"
    read -ra arr -d '' <<<"$var"
    

    (請註意 -d ''中的空格 ,它不能被遗忘),但這可能会给您帶来来自 <<<"$var"的意外換行 (因為這会在末尾隱式添加一个LF)。

    示例:

    touch NOPE
    var="* a  *"
    read -ra arr <<<"$var"
    for a in "${arr[@]}"; do echo "[$a]"; done
    

    輸出預期的

    [*]
    [a]
    [*]
    

    因為此解決方案(与此處的所有先前解決方案相反)不容易發生意料之外且通常不可控製的外壳問题。

    這也可以為您提供IFS的全部功能,

    示例:

    IFS=: read -ra arr < <(grep "^$USER:" /etc/passwd)
    for a in "${arr[@]}"; do echo "[$a]"; done
    

    輸出類似:

    [tino]
    [x]
    [1000]
    [1000]
    [Valentin Hilbig]
    [/home/tino]
    [/bin/bash]
    

    如您所见,空格也可以這樣儲存:

    IFS=: read -ra arr <<<' split  :   this    '
    for a in "${arr[@]}"; do echo "[$a]"; done
    

    輸出

    [ split  ]
    [   this    ]
    

    請註意,對 IFS的處理 BASH中的內容本身就是一个主题,因此您需要进行測試以及一些有趣的主题:

      unset IFS :忽略SPC,TAB,NL以及線上開始和結束的執行

      IFS='' :没有欄位分隔,只讀取所有內容

      IFS=' ' :SPC的執行(和仅限SPC)

      最後一个例子

      var=$'\n\nthis is\n\n\na test\n\n'
      IFS=$'\n' read -ra arr -d '' <<<"$var"
      i=0; for a in "${arr[@]}"; do let i++; echo "$i [$a]"; done
      

      輸出

      1 [this is]
      2 [a test]
      

      同時

      unset IFS
      var=$'\n\nthis is\n\n\na test\n\n'
      read -ra arr -d '' <<<"$var"
      i=0; for a in "${arr[@]}"; do let i++; echo "$i [$a]"; done
      

      輸出

      1 [this]
      2 [is]
      3 [a]
      4 [test]
      

      順便說一句:

        If you are not used to $'ANSI-ESCAPED-STRING' 习惯了,节省了時間。

        如果不包括 -r (例如在 read -a arr <<<"$var"中 ),然後讀取反斜杠轉義符.留给讀者练习。


        第二个問题:

        為了測試字元串中的某些东西,我通常坚持使用 case ,因為這樣可以一次檢查多个案例(註意:案例仅執行第一个匹配項,如果需要插入,請使用multiplce case 語句),而這種需求经常是這種情况(双關語意):

        case "$var" in
        '')                empty_var;;                # variable is empty
        *' '*)             have_space "$var";;        # have SPC
        *[[:space:]]*)     have_whitespace "$var";;   # have whitespaces like TAB
        *[^-+.,A-Za-z0-9]*) have_nonalnum "$var";;    # non-alphanum-chars found
        *[-+.,]*)          have_punctuation "$var";;  # some punctuation chars found
        *)                 default_case "$var";;      # if all above does not match
        esac
        

        因此,您可以設置返迴值来檢查SPC,如下所示:

        case "$var" in (*' '*) true;; (*) false;; esac
        

        為什麼 case ? 因為它通常比正則表達式更具可讀性,而且借助Shell元字元,它可以很好地處理99%的所有需求。

  • 5月前
    5 #

    $ echo "This is   a sentence." | tr -s " " "\012"
    This
    is
    a
    sentence.
    

    要檢查空格,請使用grep:

    $ echo "This is   a sentence." | grep " " > /dev/null
    $ echo $?
    0
    $ echo "Thisisasentence." | grep " " > /dev/null     
    $ echo $?
    1
    

  • macos:Mavericks上的MAMP Pro 305已更新為優胜美地-Apache無法啟動
  • bash:如何在Shell指令碼中解析符號鏈接