मैं व्हाट्सएप वर्णों को एक साथ विलय करने से `IFS` के साथ` read` को कैसे रोकूं? [डुप्लिकेट]

Nov 26 2020

इस कोड के टुकड़े को लीजिए जो डेटा द्वारा अलग-अलग पढ़ता है |

DATA1="Andreas|Sweden|27"
DATA2="JohnDoe||30"   # <---- UNKNOWN COUNTRY
while IFS="|" read -r NAME COUNTRY AGE; do 
    echo "NAME:    $NAME"; echo "COUNTRY: $COUNTRY";
    echo "AGE:     $AGE"; done<<<"$DATA2"

उत्पादन:

NAME: JohnDoe
देश:
AGE: 30

यह कोड के इस टुकड़े के लिए अनौपचारिक रूप से काम करना चाहिए , जहां हम एक ही काम कर रहे हैं, बस \tइसके बजाय एक विभाजक के रूप में उपयोग कर रहे हैं|

DATA1="Andreas  Sweden  27"
DATA2="JohnDoe      30"  # <---- THERE ARE TWO TABS HERE
while IFS=$'\t' read -r NAME COUNTRY AGE; do echo "NAME: $NAME";
    echo "COUNTRY: $COUNTRY"; echo "AGE: $AGE";
done<<<"$DATA2"

लेकिन यह नहीं है।

उत्पादन:

नाम: जॉनडे
देश: 30
उम्र:

बैश, या readया IFSया कोड का कोई अन्य हिस्सा व्हाट्सएप पर एक साथ ग्लोबिंग कर रहा होता है जब इसे माना नहीं जाता है। यह क्यों हो रहा है, और मैं इसे कैसे ठीक कर सकता हूं?

जवाब

3 fpmurphy Nov 26 2020 at 11:00

bashजैसा व्यवहार करना चाहिए वैसा ही व्यवहार करना चाहिए। से bashप्रलेखन:

शेल IFS के प्रत्येक चरित्र को एक सीमांकक के रूप में मानता है, और इन वर्णों पर अन्य विस्तार के परिणामों को शब्दों में विभाजित करता है। यदि IFS परेशान है, या इसका मान बिल्कुल <space><tab><newline>, डिफ़ॉल्ट है, तो , और <space>, का अनुक्रम है<tab><newline>पिछले विस्तार के परिणामों की शुरुआत और अंत को नजरअंदाज कर दिया जाता है, और शुरुआत या अंत में IFS वर्णों के किसी भी क्रम को शब्दों को चित्रित करने का कार्य नहीं किया जाता है। यदि आईएफएस में डिफ़ॉल्ट के अलावा एक मूल्य है, तो व्हाट्सएप वर्णों के स्थान और टैब को शब्द के आरंभ और अंत में नजरअंदाज कर दिया जाता है, जब तक कि व्हाट्सएप चरित्र IFS (IFS Iitespace वर्ण) के मान में है। IFS में कोई भी चरित्र जो IFS व्हाट्सएप नहीं है, किसी भी निकटवर्ती IFS व्हाट्सएप वर्ण के साथ, एक क्षेत्र का परिसीमन करता है। IFS व्हॉट्सएप पात्रों का एक अनुक्रम भी एक सीमांकक के रूप में माना जाता है।

इस "सुविधा" को दूर करने के लिए, आप निम्नलिखित की तरह कुछ कर सकते हैं:

#!/bin/bash

DATA1="Andreas  Sweden  27"
DATA2="JohnDoe          30"  # <---- THERE ARE TWO TABS HERE

echo "$DATA2" | sed 's/\t/;/g' | while IFS=';' read -r NAME COUNTRY AGE; do echo "NAME: $NAME"
    echo "COUNTRY: $COUNTRY" echo "AGE: $AGE"
done