คำสั่ง Sed ด้วยเครื่องหมายอะโพสโทรฟี


2
sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'

ฉันมีข้อผิดพลาดนี้:

  sed: -e expression, char 20: unterminated `s' command

ได้โปรดฉันจะแก้ไขคำสั่ง sed ได้อย่างไร

คำตอบ:


7
$ 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'/

เมื่อคุณรวมมันเข้าด้วยกันคุณสามารถลองเพิ่มช่องว่างและอักขระจากนั้นคุณจะเห็นว่าโหมดคำพูดของคุณเปิดหรือปิดอยู่ ถ้ามันปิดอยู่แล้วถ้าคุณต้องการหลีกเลี่ยงการอ้างคำเดียวให้ใช้ \ 'ถ้าเปิดอยู่แล้วให้ปิดด้วย' แล้วทำ \ 'ถ้าคุณสูญเสียการติดตามเมื่อมีการเปิดหรือปิดให้เพิ่มช่องว่างดูว่าทำให้พารามิเตอร์ใหม่หรือไม่ หรือไม่.


1
@researcher แม้ว่าคุณจะไม่รู้ C. หากคุณสามารถคอมไพล์โปรแกรม C นั้นและเข้าใจวิธีการใช้มันก็จะช่วยคุณได้มากถ้าคุณเจอปัญหาที่จะหลบหนีสิ่งต่าง ๆ ในบรรทัดคำสั่ง ตัวอย่างเช่นโปรแกรมเหล่านี้ทั้งหมดคือโปรแกรม C และโปรแกรม C ตัวเล็ก ๆ จะแสดงให้คุณเห็นว่าพวกเขาจะเห็นพารามิเตอร์อย่างไร
barlop

2

คุณจะต้องหลีกเลี่ยงอัญประกาศเดี่ยวในsคำสั่งsed :

sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: '\''Test Cluster1'\''/'

การแก้ไขคำพูดเดียวมักจะยุ่งยาก มีคำพูดเดียวในสตริงที่คุณแทนที่ด้วย'\''ฉันจะพยายามอธิบายวิธีการทำงานนี้ - อย่าลังเลที่จะปรับปรุงให้ดีขึ้น!

'\''- ราคาแรกจบด้วยสตริงและสิ่งที่ตามมาคือการแยกโดยเชลล์ แบ็กสแลชแสดงผลอักขระที่ตามมาเป็นอักขระอย่างง่าย (ไม่ใช่เมตาอักขระ) sedอ้างสุดท้ายจบแล้วทุบตีตีความส่วนและสิ่งที่ตามมาคือแยกวิเคราะห์โดย


EOF ที่ไม่คาดคิดขณะมองหาการจับคู่ `''
นักวิจัย

การแก้ไขคำพูดเดียวเป็นความเจ็บปวด! ฉันตอบคำถามแล้ว
suspectus

คุณยังคงล้มเหลว $ echo abc|sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: \'Test Cluster1\'/' >CTRL-C ลองใช้ one
barlop

ฉันพลาดเมตาดาต้าพิเศษในสตริงการแทนที่ แก้ไขแล้ว
suspectus

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