Sed: ตัวเลือกที่ไม่รู้จักเป็น `s '


1

ฉันกำลังพยายามเปลี่ยนไฟล์ปรับแต่งโดยใช้ bash script ฉันใช้คำสั่ง sed เพื่อเปลี่ยนดังนี้

VAR1=$(cat postgresql.conf | grep "shared_buffers =" | cut -d# -f1)
VAR2=$(shared_buffers = 8GB)
sed -ie s/${VAR1}/${VAR2}/g postgresql.conf 

ฉันพยายาม แต่มันทำให้ฉันมีข้อผิดพลาด

sed: -e expression # 1, ถ่าน 29: ตัวเลือกที่ไม่รู้จักเป็น `s '

อะไรหายไป?


โปรดลองใช้เครื่องหมายคำพูด:sed -ie "s/${VAR1}/${VAR2}/g" postgresql.conf
Marco

คุณกำลังพยายามทำอะไรที่ไม่ได้รับการแก้ไขโดยการเปลี่ยนตัวง่าย ๆ เช่นsed -e '/shared_buffers /s/=[^#]*/= 8GB /'หรือคล้ายกัน?
Toby Speight

การติดตามสคริปต์ของคุณด้วยbash -xควรระบุสิ่งที่คุณทำผิด
Toby Speight

sed -ie "s / $ {VAR1} / $ {VAR2} / \ t / g" postgresql.conf ฉันใช้คำสั่ง sed ดังกล่าวข้างต้นและทำงานได้ แต่สิ่งที่ฉันเปลี่ยนกลายเป็น shared_buffers = 8GB # ขั้นต่ำ 128kB อย่างไร ฉันจะเพิ่มแท็บได้หรือไม่ @TobySpeight
ลี

ตอบรับการอัปเดตด้วยคำสั่งที่ง่ายขึ้นซึ่งจะทำให้ช่องว่างที่มีอยู่เข้าแทนที่
Toby Speight

คำตอบ:


4

สาเหตุปกติคือหนึ่งในตัวแปรของคุณมีตัวคั่น (ในกรณีของคุณ/) คุณสามารถ

  • เปลี่ยนตัวคั่นหากคุณมีอักขระอื่นที่ไม่มีอยู่:

    sed -e "s#${VAR1}#${VAR2}#g"

    หรือ

  • แทนที่ตัวคั่นในตัวแปร:

    sed -e "s/${VAR1//\//\\/}/${VAR2//\//\\/}/g"

อาจมีการแทนที่อื่น ๆ ที่คุณต้องทำ$VAR1หากคุณต้องการให้มันตรงกันเป็นตัวอักษรและs///ใช้นิพจน์ทั่วไปเสมอ


อย่างไรก็ตามเมื่อดูสิ่งที่คุณแสดงให้เราเห็นว่าสิ่งที่คุณพยายามทำจริงๆคือเปลี่ยนค่าที่กำหนดให้shared_buffersในไฟล์กำหนดค่าเป็นค่าคง8GBที่ซึ่งในกรณีนี้ไม่จำเป็นต้องใช้ตัวแปรใด ๆ :

sed -i -e '/^shared_buffers[ \t]/s/=[ \t]*[^# \t]\+/= 8GB/' /postgresql.conf

คุณสามารถอ่านได้ว่าในทุกบรรทัดที่ขึ้นต้นด้วยshared_buffersและเว้นวรรคในแนวนอนจากนั้นแทนที่คำแรก=และคำที่ตามมาด้วย= 8GBซึ่งเป็นสิ่งที่คุณต้องการ


มันทำงานโดยใช้ 'sed -ie "s / $ {VAR1} / $ {VAR2} / g" postgresql.conf' ว่ามีเส้นแบ่งระหว่างมันรวมการเปลี่ยนแปลงที่ฉันทำกับบรรทัด
Lee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.