ข้อผิดพลาด sed: "การอ้างอิงที่ไม่ถูกต้อง \ 1 ใน RHS ของคำสั่ง 's'


106

ฉันเรียกใช้คำสั่งเปลี่ยนตัวหลายเป็นหลักของการสคริปต์ Colorize สำหรับผู้เชี่ยวชาญ หนึ่งในsedคำสั่งที่ใช้การแสดงออกปกติที่ทำงานพบในเปลือกเป็นกล่าวถึงที่นี่ ปัจจุบัน (ไม่ทำงาน) การดำเนินงานที่สามารถพบได้ที่นี่

เมื่อฉันรวมหนึ่งในตัวแปรของคำสั่งลงในสคริปต์พฤติกรรมที่แตกต่างกันจะเกิดขึ้น:

ตัวแปร 1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

ปรับให้เข้ากับสคริปต์:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \

ข้อผิดพลาด:$ sedเปลือกเอาท์พุทข้อมูลเช่นเดียวกับถ้าผมจะพิมพ์ แปลก!?


ตัวแปร 2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

ปรับให้เข้ากับสคริปต์:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \

ข้อผิดพลาด:

sed: -e expression # 7, char 59: การอ้างอิงที่ไม่ถูกต้อง \ 1 บน RHS ของคำสั่ง 's'


10
ในกรณีของฉันฉันได้รวม-i(ตัวเลือกแก้ไขในสถานที่) เข้าด้วย-reซึ่งส่งผลให้-ire(ดังนั้นการ-iใช้reแฟรกเมนต์เป็นSUFFIXอาร์กิวเมนต์และด้วยเหตุนี้จึงไม่ได้เปิดใช้งานโหมด regex แบบขยาย) เปลี่ยนเพื่อ-i -reแก้ไขปัญหา
Janaka Bandara

นอกจากนี้ยังแจ้งให้ทราบว่าราคาเดียว'และราคาคู่ได้รับการปฏิบัติที่แตกต่างกันเล็กน้อยโดยเฉพาะอย่างยิ่งเมื่อมีการตีความ" $varsตัวอย่างเช่น: ใช้sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"งานได้ แต่: sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'ไม่ได้
not2qubit

คำตอบ:


59

คุณไม่จำเป็นต้องจับภาพเพื่อให้ใช้งานได้จริงหรือ? เช่นสำหรับตัวแปร # 2:

-r -e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \

(หมายเหตุ: ยังไม่ทดลอง)

หากไม่มี-rอาร์กิวเมนต์การอ้างอิงกลับ (เช่น\1) จะไม่ทำงาน


43
-rตัวเลือกที่จะปรากฏขึ้น sed จะเป็นสิ่งจำเป็นสำหรับการกลับมาอ้างอิงในการทำงาน เช่นใช้sed -e 's/([[:digit:]])/is a digit/'งานได้ แต่sed -e 's/([[:digit:]])/\1 is a digit/สร้างข้อผิดพลาดดั้งเดิมโดยไม่ต้อง-rใจเย็น หมายเหตุ:การเรียกครั้งแรกของ sed ค้นหาตัวอักษร(<digit>)และไม่ใช่กลุ่มการจับภาพ
Andrew Falanga

ความคิดเห็นด้านล่างคำตอบคือคำตอบที่แท้จริง บางทีคุณอาจแก้ไขคำตอบของคุณเพื่อสะท้อนคำตอบได้
miroxlav

@AndrewFalanga คุณควรจะโพสต์ความคิดเห็นของคุณเป็นคำตอบ
sanmai

2
ไม่เป็นไรผิดพลาดของฉันคือการใช้แทนการใช้-ire -riสั่งซื้อเรื่อง :-)
m3nda

57

ข้อผิดพลาดนี้เป็นเรื่องปกติสำหรับวงเล็บที่ไม่ได้ใช้ Escape หนีพวกเขาและลองอีกครั้ง


ตัวอย่างเช่น:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g

ควรหลีกเลี่ยงโดยมีแบ็กสแลชก่อนวงเล็บแต่ละอัน:

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g

7
โปรดทราบหากคุณใช้-rคุณไม่จำเป็นต้องออกจากวงเล็บ
qräbnö


6

คุณต้องหลบหนี/หลังจาก.

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"

หรือถ้าไม่อยากกังวลเรื่องการหลบหนีให้ใช้ |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"

แก้ไข:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"

ฟังดูสมเหตุสมผล แต่มันไม่ทำงานในบริบทของสคริปต์
JJD

ขออภัย. การแก้ไขทำให้เกิดข้อผิดพลาด: sed: -e expression #7, char 58: Invalid range end. คำตอบของ @ เดนิสใช้ได้ผล
JJD

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