sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'
ฉันมีข้อผิดพลาดนี้:
sed: -e expression, char 20: unterminated `s' command
ได้โปรดฉันจะแก้ไขคำสั่ง sed ได้อย่างไร
sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'
ฉันมีข้อผิดพลาดนี้:
sed: -e expression, char 20: unterminated `s' command
ได้โปรดฉันจะแก้ไขคำสั่ง sed ได้อย่างไร
คำตอบ:
$ sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/"
หรือ
sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'Test' 'Cluster1\'/
สิ่งที่มีเครื่องหมายคำพูดเดี่ยวทั้งหมดเป็นเรื่องยากที่จะสร้างโดยไม่มีโปรแกรมนี้ช่วยถ้าคุณต้องการความช่วยเหลือในการรับคำสั่งให้ถูกต้องมีโปรแกรม C ที่คุณสามารถใช้
$ cat w.c
#include <stdio.h>
int main(int argc, char *argv[]) {
int i = 0;
while (argv[i]) {
printf("argv[%d] = %s\n", i, argv[i]);
i++;
}
return 0;
}
ฉันกำลังทดสอบจาก cygwin แต่เชลล์ * nix ควรจะเหมือนกัน
คุณเห็นงานนี้
$ ./w sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Clust
er1'/"
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/
$
ในขณะที่ถ้าคุณลองจากสงสัย
sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test Cluster1\'/'
คุณสามารถใช้โปรแกรมเพื่อค้นหาความผิดปกติได้
หนึ่งของเขาไม่ได้ดำเนินการ
$ ./w sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test C
luster1\'/'
>CTRL-C
เพราะมันมีคำพูดเดียวที่ขาดหายไป
$ ./w 'fgg
>
ท่ามกลางปัญหาอื่น ๆ
และถ้าคุณดูที่ตัวสงสัยของมันมันจะล้มเหลวแม้กระทั่งใกล้ถึงจุดเริ่มต้น
$ ./w sed -e 's/cluster_name: \'Test Clu
argv[0] = f:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: \Test
argv[4] = Clu
อันนี้ใช้ได้ผล
$ ./w sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'
Test' 'Cluster1\'/
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/
เมื่อคุณรวมมันเข้าด้วยกันคุณสามารถลองเพิ่มช่องว่างและอักขระจากนั้นคุณจะเห็นว่าโหมดคำพูดของคุณเปิดหรือปิดอยู่ ถ้ามันปิดอยู่แล้วถ้าคุณต้องการหลีกเลี่ยงการอ้างคำเดียวให้ใช้ \ 'ถ้าเปิดอยู่แล้วให้ปิดด้วย' แล้วทำ \ 'ถ้าคุณสูญเสียการติดตามเมื่อมีการเปิดหรือปิดให้เพิ่มช่องว่างดูว่าทำให้พารามิเตอร์ใหม่หรือไม่ หรือไม่.
คุณจะต้องหลีกเลี่ยงอัญประกาศเดี่ยวในs
คำสั่งsed :
sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: '\''Test Cluster1'\''/'
การแก้ไขคำพูดเดียวมักจะยุ่งยาก มีคำพูดเดียวในสตริงที่คุณแทนที่ด้วย'\''
ฉันจะพยายามอธิบายวิธีการทำงานนี้ - อย่าลังเลที่จะปรับปรุงให้ดีขึ้น!
'\''
- ราคาแรกจบด้วยสตริงและสิ่งที่ตามมาคือการแยกโดยเชลล์ แบ็กสแลชแสดงผลอักขระที่ตามมาเป็นอักขระอย่างง่าย (ไม่ใช่เมตาอักขระ) sed
อ้างสุดท้ายจบแล้วทุบตีตีความส่วนและสิ่งที่ตามมาคือแยกวิเคราะห์โดย
$ echo abc|sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: \'Test Cluster1\'/' >CTRL-C
ลองใช้ one