متن را با استفاده از دستورات متن را پیدا کرده و جایگزین کنید


به جواب پذیرفته شده بروید




چگونه می توانم با استفاده از خط فرمان کلمات خاص را در یک فایل متنی پیدا و جایگزین کنم؟


680









7 :تعداد پاسخها


 sed -i 's/original/new/g' file.txt
 

توضیح:

  • sed = ویرایشگر جریان
  • -i = در محل (به عنوان مثال ذخیره در پرونده اصلی)
  • رشته فرمان:

    • s = دستور جایگزین
    • original = یک عبارت منظم که کلمه جایگزینی را توصیف می کند (یا فقط خود کلمه)
    • new = متن برای جایگزین کردن آن با
    • g = جهانی (یعنی جایگزین کردن همه و نه فقط اولین مورد)
  • file.txt = نام پرونده


1106



برای این کار چندین روش مختلف وجود دارد. یکی استفاده sed و Regex است. SED ویرایشگر جریان برای فیلتر و تبدیل متن است. یک مثال به شرح زیر است:

 [email protected]: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
[email protected]: ~$ sed s/slow/quick/ < orly > yarly
[email protected]: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog
 

راه دیگر که ممکن است حس بیش از را < strin و > strout با لوله های!

 [email protected]: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
[email protected]: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog
 

34



روش های زیادی برای دستیابی به آن وجود دارد. بسته به پیچیدگی کاری که فرد با تعویض رشته می تواند به آن دست یابد ، و بسته به ابزارهایی که کاربر با آن آشنا است ، ممکن است برخی از روش ها بیشتر از سایرین ترجیح داده شود.

در این پاسخ من از input.txt پرونده ای ساده استفاده می کنم که می توانید برای تست تمام نمونه های ارائه شده در اینجا استفاده کنید. محتوای پرونده:

 roses are red , violets are blue
This is an input.txt and this doesn't rhyme
 

باشه

Bash برای پردازش متن به معنای واقعی نیست ، اما جایگزینی های ساده از طریق گسترش پارامترها قابل انجام است ، به ویژه در اینجا می توان از ساختار ساده استفاده کرد ${parameter/old_string/new_string} .

 #!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt
 

این اسکریپت کوچک جایگزینی داخلی ندارد ، به این معنی که باید متن جدید را در پرونده جدید ذخیره کنید ، و از پرونده قدیمی خلاص شوید ، یا mv new.txt old.txt

توجه داشته باشید جانبی: اگر به دلیل while IFS= read -r ; do ... done < input.txt استفاده از آنها کنجکاو هستید ، در اصل روش خواندن خط به صورت خط پوسته است. مشاهده این برای مرجع است.

AWK

AWK ، یک ابزار پردازش متن ، برای چنین کارهایی کاملاً مناسب است. این می تواند جایگزینی ساده و موارد پیشرفته تر را بر اساس عبارات منظم انجام دهد . این دو عملکرد را فراهم می کند: sub() و gsub() . مورد اول فقط اولین مورد را جایگزین می کند ، در حالی که دوم - وقایع را در کل رشته جایگزین می کند. به عنوان مثال ، اگر رشته ای داشته باشیم one potato two potato ، این نتیجه خواهد بود:

 $ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'
one banana two banana

$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      
one banana two potato 
 

AWK می تواند یک فایل ورودی را به عنوان استدلال به دست آورد ، بنابراین انجام همان کارها با input.txt آن آسان خواهد بود:

 awk '{sub(/blue/,"azure")}1' input.txt
 

بسته به نسخه AWK شما ، ممکن است ویرایش داخلی داشته باشد یا نباشد ، از این رو روش معمول ذخیره و جایگزینی متن جدید است. به عنوان مثال چیزی شبیه به این:

 awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt
 

SED

سد یک ویرایشگر خط است. همچنین از عبارات منظم استفاده می کند ، اما برای جایگزینی های ساده کافی است:

 sed 's/blue/azure/' input.txt
 

نکته جالب در مورد این ابزار این است که ویرایش داخلی دارد ، که می توانید با استفاده از -i پرچم آن را فعال کنید .

پرل

Perl ابزاری دیگر است که اغلب برای پردازش متن استفاده می شود ، اما این یک زبان عمومی است و در شبکه سازی ، مدیریت سیستم ، برنامه های دسک تاپ و بسیاری از مکان های دیگر استفاده می شود. این مفاهیم / ویژگی های زیادی را از زبان های دیگر مانند C ، sed ، awk و دیگران قرض گرفت. تعویض ساده می تواند به این صورت انجام شود:

 perl -pe 's/blue/azure/' input.txt
 

مانند sed ، پرل نیز دارای پرچم -i است.

پایتون

این زبان بسیار متنوع است و در کاربردهای متنوعی نیز به کار می رود. این توابع زیادی برای کار با رشته ها دارد ، از جمله این موارد replace() ، بنابراین اگر متغیری مانند آن دارید var="Hello World" ، می توانید انجام دهید var.replace("Hello","Good Morning")

روش ساده برای خواندن پرونده و جایگزینی رشته در آن به این صورت است:

 python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt
 

با وجود پایتون ، شما باید به فایل جدیدی هم بروید ، که می توانید از درون خود اسکریپت نیز انجام دهید. به عنوان مثال ، در اینجا یک مثال ساده وجود دارد:

 #!/usr/bin/env python
import sys
import os
import tempfile

tmp=tempfile.mkstemp()

with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
    for line in fd1:
        line = line.replace('blue','azure')
        fd2.write(line)

os.rename(tmp[1],sys.argv[1])
 

این اسکریپت به input.txt عنوان استدلال خط فرمان خوانده می شود. دستور دقیق اجرای اسکریپت پایتون با استدلال خط فرمان خواهد بود

  $ ./myscript.py input.txt
 

یا

 $ python ./myscript.py input.txt
 

البته ، اطمینان حاصل کنید که ./myscript.py در فهرست کار فعلی شماست و برای اولین بار ، اطمینان حاصل کنید که آن را با قابلیت اجرا تنظیم کنید chmod +x ./myscript.py

پایتون همچنین می تواند عبارات منظم داشته باشد ، به ویژه ، re ماژول وجود دارد ، که دارای re.sub() عملکردی است ، که می تواند برای تعویض پیشرفته تر مورد استفاده قرار گیرد.


27



می توانید از Vim در حالت Ex External استفاده کنید:

 ex -s -c '%s/OLD/NEW/g|x' file
 
  1. % همه خطوط را انتخاب کنید

  2. s جایگزین

  3. g همه موارد را در هر خط جایگزین کنید

  4. x اگر تغییرات ایجاد شده است (آنها وجود دارد) و از آن خارج شوید


22



از طریق دستور gsub awk ،

 awk '{gsub(/pattern/,"replacement")}' file
 

مثال:

 awk '{gsub(/1/,"0");}' file
 

در مثال بالا ، همه 1 ها بدون در نظر گرفتن ستونی که در آن قرار دارد با 0 جایگزین می شوند.


اگر می خواهید یک ستون خاص جایگزینی انجام دهید ، پس این کار را انجام دهید ،

 awk '{gsub(/pattern/,"replacement",column_number)}' file
 

مثال:

 awk '{gsub(/1/,"0",$1);}' file
 

فقط 1 در 0 در ستون اول جایگزین می شود.

از طریق پرل ،

 $ echo 'foo' | perl -pe 's/foo/bar/g'
bar
 

21



sed است که بازدید کنندگان tream اد itor ، در آن شما می توانید استفاده کنید | (لوله) را برای ارسال جریان استاندارد (stdin و STDOUT به طور خاص) از طریق sed و تغییر آنها را از طریق برنامه نویسی در پرواز، و آن را یک ابزار مفید در سنت فلسفه یونیکس. اما می توانید با استفاده از -i پارامتر ذکر شده در زیر ، مستقیماً پرونده ها را ویرایش کنید.
موارد زیر را در نظر بگیرید :

 sed -i -e 's/few/asd/g' hello.txt
 

s/ است مورد استفاده قرار بازدید کنندگان ubstitute بیان پیدا شده است few با asd :

معدود ، شجاع.


ASD ، شجاع.

/g مخفف "جهانی" است ، به معنای انجام این کار برای کل خط. اگر از کار خارج شوید /g ( s/few/asd/ مهم نیست ، بدون توجه به آنچه همیشه باید سه برش وجود داشته باشد) و few دو بار در همان خط ظاهر می شود ، فقط اولین مورد به few حالت زیر تغییر می یابد asd :

معدود مردها ، معدود زنها ، شجاع هستند.


مردان صعب العبور ، معدود زنها ، شجاع هستند.

این کار در بعضی شرایط مانند تغییر شخصیت های خاص در آغاز خطوط مفید است (به عنوان مثال ، جایگزین کردن نمادهای بزرگتر از برخی از افراد برای نقل قول مطالب قبلی در موضوعات ایمیل با زبانه افقی در حالی که یک نابرابری جبری به نقل از آن بعدا در خط باقی می مانند ، مفید است. دست نخورده) ، اما در مثال خود که مشخص کردید که در هر مکانی few رخ می دهد باید جایگزین شود ، حتماً آن را داشته باشید /g .

دو گزینه زیر (پرچم) در یک ترکیب شده است -ie :

-i گزینه برای ویرایش i n n محل در پرونده استفاده می شود hello.txt .

-e در این حالت گزینه e xpression / فرمان اجرا شده را نشان می دهد s/ .

توجه: مهم است که شما از آن -i -e برای جستجوی / جایگزینی استفاده کنید. در صورت انجام این کار -ie ، از هر پرونده پشتیبان تهیه نامه با نامه "e" ضمیمه می کنید.


8



شما می توانید مانند این انجام دهید:

 locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g" 
 

مثال: برای جایگزین کردن تمام وقایع [logdir '،' '] (بدون []) با [logdir'، os.getcwd ()] در کلیه پرونده هایی که نتیجه یافتن دستور هستند ، انجام دهید:

ex1:

 locate tensorboard/program.py | xargs sed -i -e "s/old_text/NewText/g"
 

ex2:

 locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"
 

جایی که [tensorboard / program.py] پرونده برای جستجو است


2



انتشارات مرتبط


با استفاده از خط فرمان ، پرونده ای را پیدا کنید

چگونه می توانم به راحتی چندین فایل را با استفاده از خط فرمان تغییر نام دهم؟

متن را در چندین فایل پیدا و جایگزین کنید

چگونه آخرین نسخه Ruby را با استفاده از RVM پیدا و نصب کنیم؟

متن را در چند پی دی اف و اسناد جستجو کنید

چگونه می توانم با استفاده از خط فرمان یک خط را در بالای یک فایل متنی وارد کنم؟

چگونه می توان از یک فایل با استفاده از خط فرمان تصویر را در کلیپ بورد کپی کرد؟

کلمات را با استفاده از یک دستور ترمینال به یک فایل متنی اضافه کنید (بدون ویرایشگر)

چگونه می توان همه پرونده های pdf را به یک متن به متن (درون یک پوشه) تبدیل کرد؟

چگونه می توان متن را در Emacs با استفاده از صفحه کلید انتخاب و کپی کرد؟

[command-line] سوال برچسب


چگونه اسکریپتهای .sh را اجرا کنم؟

چگونه برنامه پیش فرض را تنظیم کنم؟

جک هدفون کار نمی کند؟

Apparmor چیست؟

چگونه یک کاربر خاص را از صفحه ورود مخفی کنم؟

ترم ، Xterm یا Uxterm؟

شماره تنظیم VirtualBox '/etc/init.d/vboxdrv

آیا راهی برای "راه اندازی مجدد" درایور تاچ پد وجود دارد؟

خاموش کردن رایانه خاموش نمی شود

E: dpkg قطع شد ... sudo dpkg را اجرا کنید - پیکربندی -a '