วิธีการแทนที่ line ในไฟล์ด้วย pattern ด้วย sed?


28

ฉันกำลังอ่านเอกสารจำนวนมากเกี่ยวกับ sed และยังคงนิ่งงันในกรณีการใช้งานเฉพาะของฉัน

ฉันต้องการแทนที่บรรทัดนี้ในไฟล์ conf ด้วยบรรทัดของฉันเอง:

แทนที่บรรทัดนี้:

#maxmemory <bytes>
ด้วย:
maxmemory 26gb

นี่คือสิ่งที่ฉันพยายาม:

sed s / maxmemory. * bytes. * / maxmemory 26gb / /etc/redis/redis.conf

ฉันได้รับข้อผิดพลาด:

sed: -e นิพจน์ # 1, ถ่าน 30: คำสั่ง `s 'ที่ไม่ถูกทำลาย

ซึ่งทำให้ฉันตกใจเพราะฉันไม่รู้ว่ามันหมายถึงอะไร ดังนั้นคำถามของฉันคือ:

ฉันจะทำสิ่งที่ฉันต้องการให้สำเร็จได้อย่างไร ข้อผิดพลาดนั้นหมายความว่าอย่างไร (ดังนั้นฉันสามารถเรียนรู้จากมัน)

คำตอบ:


29

คุณลืม -i การปรับเปลี่ยนควรทำในสถานที่:

$ sed -i 's/maxmemory.*/maxmemory 26gb/' /some/file/some/where.txt


และถ้าคุณมีทับในสายของคุณคุณต้องใช้ตัวอักษรตัวคั่นอื่นแทน/เช่นหรือ@ |ดูที่นี่: stackoverflow.com/a/9366940/4561887และนี่: unix.stackexchange.com/a/259087/114401
Gabriel Staples

11

จริง

ข้อผิดพลาดหมายความว่าในกรณีที่ไม่มีอัญประกาศเชลล์ของคุณใช้ช่องว่างเพื่อแยกอาร์กิวเมนต์ ช่องว่างระหว่างmaxmemoryและ26gbถือเป็นการยกเลิกอาร์กิวเมนต์แรกซึ่งขาดเทอร์มินัล/เมื่อsedแยกวิเคราะห์อาร์กิวเมนต์นั้นเป็นหนึ่งในคำสั่งของมัน

การวาง regex ของคุณระหว่างเครื่องหมายคำพูดเดี่ยวเพื่อให้เชลล์ของคุณไม่ได้แบ่งออกเป็นหลายอาร์กิวเมนต์และส่งให้sedเป็นอาร์กิวเมนต์เดียวแก้ปัญหา:

$ sed s/maxmemory.*/maxmemory 26gb/ /some/file/some/where.txt
sed: -e expression n°1, caractère 23: commande `s' inachevée

ในขณะที่

$ sed 's/maxmemory.*/maxmemory 26gb/' /some/file/some/where.txt

โรงงาน

หวังว่าจะช่วย


1
มันไม่ได้sedทำอย่างนี้ มันคือเปลือกหอยที่ทำสิ่งนี้
JdeBP

คุณขวาแน่นอนขอบคุณสำหรับหัวขึ้น :)
Sxilderik

3

กรณีการใช้งานของคุณจะได้รับการแก้ไขโดยคำสั่งนี้

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf

5
บางทีคุณต้องการเพิ่มคำอธิบายเล็ก ๆ
davidbaumann

2
-e เป็นสิ่งจำเป็นสำหรับ MacOS ในกรณีของฉัน
cancerbero
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.