पुनरावर्ती सेड का परीक्षण करें और दौड़ने से पहले बदलें


13

क्या sedवास्तव में इसे चलाने से पहले परीक्षण पुनरावर्ती खोज चलाने और उपयोग करने की जगह लेने का कोई तरीका है? मैं वास्तव में खोज करने और बदलने से पहले परिणामों को प्रिंट करना चाहता हूं। के परिणाम गूँजने जैसा कुछ

grep -rl term1 . |xargs sed -i -e 's/term1/term2/'

डेटा की एक प्रति बनाएं, अपनी कमांड चलाएं, परिणाम का निरीक्षण करें।
Kusalananda

जवाबों:


10

आप sedबिना -iआउटपुट के साथ कदम रख सकते हैंless

grep -rl --null term1 . | xargs -0 sed -e 's/term1/term2/' | less

फिर से चलाने के sedसाथ -i.bakबैकअप जो आप बाद में diff कर सकते हैं बनाने के लिए

grep -rl --null term1 . | xargs -0 sed -i.bak -e 's/term1/term2/'
diff somefile.bak somefile
# verify changes were correct

संपादित करें: जैसा कि टिप्पणी में सुझाया गया है, उपयोग करें grep --null | xargs -0। यह फ़ाइल नाम को नल-बाइट द्वारा समाप्त करने का कारण बनता है, जो इसे नए नाम जैसे असामान्य पात्रों के साथ फ़ाइल नाम के लिए सुरक्षित बनाता है। हां, \nएक यूनिक्स फ़ाइल नाम में एक मान्य चरित्र है। केवल निषिद्ध वर्ण स्लेश /और शून्य वर्ण हैं\0


दिलचस्प है, मैंने -i का अर्थ खोजने की कोशिश की, लेकिन यह मैन सेड के तहत सूचीबद्ध नहीं था। आपके समाधान ने काम किया। आपकी राय में सबसे अच्छा तरीका क्या होगा, बस पूरी सूची को सूचीबद्ध करें, न कि पूरी फाइल को? कम पाइप लगाने के बजाय मैंने पाइप किया | grep term2, जिस पर काम किया गया था, लेकिन मुझे अजीब पात्रों के साथ भी कुछ आउटपुट मिला।
user251482

@ user251482 - "पुरानी और नई फ़ाइल के बीच अंतर देखना" के रूप में "बस लाइनों को सूचीबद्ध करें"?
grebneke

1
@StephaneChazelas हाँ, या इससे भी बेहतर है grep -rl --nullक्योंकि ओपी ने ओएस निर्दिष्ट नहीं किया था, और -Zइसका मतलब है कि बीएसडी / ओएसएक्स (डीकंप्रेस) पर कुछ अलग है। --nullGNU और BSD
grebneke

1
@grebneke। अच्छी बात है, लेकिन ध्यान दें कि ओपी GNU सेड सिंटैक्स का उपयोग कर रहा है, इसलिए हम मान सकते हैं कि वह बीएसडी पर नहीं है। ध्यान दें कि grepFreeBSD और NetBSD पर GNU grep का (कांटा) है। NetBSD पर, -Zअभी भी --null(मैन पेज के अनुसार) का अर्थ है , लेकिन मैं मानता हूं --null अधिक पोर्टेबल है। यह भी ध्यान दें कि OpenBSD पर न तो - न ही और न ही -Z काम
Stéphane Chazelas

1
@grebneke, यह sed -i '' -e s/.../BSD में है sed(वहां कोई वैकल्पिक विकल्प नहीं है)
स्टीफन चेज़लस

5

sedके findबजाय के साथ प्रयोग करेंgrep

सबसे पहले, मैं इसके findबजाय grepऔर तीन अच्छे कारणों से काम करूंगा :

  1. findअधिक सटीक फ़ाइल चयन के लिए अनुमति देता है। उदाहरण के लिए, grep -r string *.txtकेवल वर्तमान निर्देशिका में फ़ाइलों का उत्पादन करेगा; उपनिर्देशिकाओं में नहीं।
  2. findशक्तिशाली -execविकल्प के साथ आता है जो पूरे --null … |xargs 0निर्माण की आवश्यकता को समाप्त करता है ।
  3. -readableऔर -writableका विकल्प findफ़ाइलों को पहुँचा नहीं जा सकता पर समय बर्बाद कर पाएगा।

परीक्षण पर कब्जा

उस ने कहा, grepपहले परीक्षण के लिए उधार देता है यह देखने के लिए कि क्या कब्जा किया जाएगा:

$ find . -exec grep term1 {} \;

या अधिक विशेष रूप से:

$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;

पूर्वाभ्यास

अब, एक sedसूखी रन के साथ आगे बढ़ें । sedविकल्प -nके लिए एक पर्याय है --quietऔर pके अंत में sedअभिव्यक्ति वर्तमान पैटर्न अंतरिक्ष प्रिंट होगा।

$ find . -exec sed -n 's/term1/term2/gp' {} \;

या अधिक विशेष रूप से:

$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;

क्रियान्वयन

सब कुछ ठीक लग रहा है, की जगह निश्चित आदेश जारी sedविकल्प -nद्वारा -i"स्थान पर" के लिए और हटाने के द्वारा pअंत में।

$ find . -exec sed -i 's/term1/term2/g' {} \;

या अधिक विशेष रूप से:

$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;

और findउदाहरण

अधिक findउदाहरण यहां देखे जा सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.