मैं अतिरिक्त न्यूलाइन वर्ण जोड़ने से कैसे रोकूं


17

मैं निम्नलिखित 2 sedकमांड चला रहा हूं । पहला जहाँ मैं उन्हें चाहता हूँ, वहाँ दूसरी पंक्ति के अक्षर जोड़ देता है, दूसरा जहाँ मैं चाहता हूँ, वहाँ भी नए वर्ण जोड़ते हैं, लेकिन BUT उस फ़ाइल के अंत में एक अतिरिक्त जोड़ देता है जहाँ पहले कोई नहीं था।

sed -e 's|\<LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_1.xml > ${XMLDIR}/statement_tmp_2.xml

sed -e 's|\</LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_2.xml > ${XMLDIR}/statement_tmp_3.xml

od -cसभी 3 फ़ाइलों का उपयोग करने से निम्न आउटपुट मिलता है।

statement_tmp_1.xml ( \nफ़ाइल के अंत में नहीं )

1314700    T   A   T   E   M   E   N   T   >   <   /   L   I   S   T   _
1314720    G   _   S   T   A   T   E   M   E   N   T   >   <   /   G   _
1314740    S   E   T   U   P   >   <   /   L   I   S   T   _   G   _   S
1314760    E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1314777

statement_tmp_2.xml ( \nफ़ाइल के अंत में नहीं )

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >   <   /   G
1314740    _   S   E   T   U   P   >   <   /   L   I   S   T   _   G   _
1314760    S   E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1315000

कथन_tmp_3.xml ( \nफ़ाइल के अंत में - यह कहाँ से आया था?)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >  \n   <   /
1314740    G   _   S   E   T   U   P   >   <   /   L   I   S   T   _   G
1314760    _   S   E   T   U   P   >   <   /   A   R   X   S   G   P   O
1315000    >  \n
1315002

मैं AIX 5.3 चला रहा हूं

मूल रूप से, मैं या तो यह अतिरिक्त जोड़ना बंद करना चाहता हूं \n, या इसे हटाने का एक तरीका ढूंढता हूं ।


बस एक सवाल: आप अपने प्रतिस्थापन पैटर्न में शाब्दिक नई लाइन का उपयोग क्यों कर रहे हैं जब आप s|...|&\n|बस के रूप में अच्छी तरह से इस्तेमाल कर सकते थे ?
जोसेफ आर।

1
@JosephR। \nदाहिने हाथ की तरफ पोर्टेबल नहीं है।
स्टीफन चेजलस 11

@StephaneChazelas अजीब है। क्या यह सीआर बनाम सीआरएलएफ की बात है?
जोसेफ आर।

2
एक फ़ाइल जो एक नई पंक्ति में समाप्त नहीं होती है वह एक पाठ फ़ाइल नहीं है, इसलिए उन पर पाठ उपयोगिताओं के साथ व्यवहार अनिर्दिष्ट हैperlबाइनरी डेटा से निपटने के लिए उपयोग या अन्य उपकरण।
स्टीफन चेजेलस

4
@JosephR। नहीं, \<LF>LF वर्ण जोड़ने का पारंपरिक और POSIX तरीका है। \nआम तौर पर nकुछ भी लेकिन GNU में एक चरित्र स्थानापन्न होगा sed
स्टीफन चेज़लस

जवाबों:


12

आपको खुद को खुशकिस्मत मानना ​​चाहिए कि AIX sedने उस लापता न्यूलाइन अक्षरों को जोड़ा।

एक गैर-खाली फ़ाइल जो एक नई लाइन वर्ण में समाप्त नहीं होती है वह पाठ फ़ाइल नहीं है (कम से कम एक पाठ फ़ाइल की POSIX परिभाषा के अनुसार) एक पाठ फ़ाइल का अर्थ है जिसमें लाइनें शामिल हैं और लाइनें एक (बहुत ज्यादा नहीं हैं) एक नई वर्ण द्वारा समाप्त किए गए वर्णों का लंबा) अनुक्रम, इसलिए उस पर पाठ उपयोगिताओं का व्यवहार sedअनिर्दिष्ट है और व्यवहार में कार्यान्वयन से कार्यान्वयन तक भिन्न होता है।

कुछ sedकार्यान्वयनों ने अंतिम पंक्ति के बाद उन सहज चरित्र को खारिज कर दिया होगा।

AFAIK, xmlफाइलें टेक्स्ट फाइल के रूप में होती हैं, इसलिए इसका मतलब है कि sedयह आपके लिए तय है।

यदि आपको नई फ़ाइल वर्ण में समाप्त होने के लिए उस फ़ाइल की आवश्यकता नहीं है, तो आप perlअन्य उपकरणों का उपयोग कर सकते हैं जो गैर-पाठ डेटा के साथ सामना कर सकते हैं।

perl -pe 's|<LIST_G_STATEMENT>|$&\n|g'

1
समाप्त न्यू लाइन है अगर आप पाइप के लिए अपने उम्मीद, सहायक sedकिसी अन्य मानक यूनिक्स उपयोगिता में उत्पादन। ईमानदारी से, मैंने सालों से ऐसा नहीं sedकिया था , क्योंकि बॉर्न शेल कमांड के विकल्प जैसे कि अंतिम न्यूलाइन को ट्रिम करते हैं, अगर कोई है। लेकिन ऐसे समय होते हैं जब आप निश्चित रूप से इसे नहीं चाहते हैं; उदाहरण के लिए , एक्स क्लिपबोर्ड पाठ के साथ हेरफेर । FYI करें, GNU सेड, यदि उपलब्ध हो, तो विकल्प के साथ इसका उपयोग करने पर एक टर्मिनेटिंग न्यूलाइन नहीं जोड़ता है , जैसा कि इस SE उत्तर में वर्णित है । $(sed 's/bas/replac/' <<<'basement')sedp-n
TheDudeAbides

0

यहाँ एक फाइल से अंतिम न्यूलाइन को हटाने का एक तरीका है dd:

printf "" | dd  of='/path/to/file' seek=<filesize_in_bytes - 1> bs=1 count=1

यह जांचने के लिए कि क्या कोई फ़ाइल आपके द्वारा उपयोग की जा सकने वाली नई पंक्ति के साथ समाप्त होती है:

tail -c 1 /path/to/file | tr -dc '\n' | wc -c

और बाइट्स में फ़ाइल का आकार प्राप्त करने के लिए:

wc -c < /path/to/file

0

इस AIX मैनुअल के अनुसार आईबीएम tailकरता है -r- जो बहुत अच्छा लग रहा है। जब तक आपकी फ़ाइल 20KB से कम है, तब तक निम्नलिखित कार्य करना चाहिए:

tail -r <file | dd bs=1 skip=1 | tail -r >file.new
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.