2011-11-10 63 views
9

我已經sed命令,這是非常長的一條長長的sed命令是否可以分成幾行?

sed -i 's/append ro initrd=initrd.img quiet splash nbdport=2000/append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 

可不可以這樣幾行被打破,使它更清楚?

E.g.就像是?

sed -i 's/ 
append ro initrd=initrd.img quiet splash nbdport=2000 
/
append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d 
/g' 
/var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 

回答

4

有幾種方法可以使這個更小。如果你只是附加的文本行的末尾,你可以使用SED這樣的:

sed -i '/append ro initrd=initrd.img quiet splash nbdport=2000/s/$/ video=LVDS-1:d' ... 

否則,使用shell變量將它拆分了一下。

PXE_BOOT_FILE=/var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 
SEARCH_PATTERN='append ro initrd=initrd.img quiet splash nbdport=2000' 
REPLACE_PATTERN="$SEARCH_PATTERN video=LVDS-1:d" 
sed -i "s/$SEARCH_PATTERN/$REPLACE_PATTERN/g" "$PXE_BOOT_FILE" 
+0

什麼是s/$ /意味着針後?你能多解釋一下嗎? – Bytemain

+0

@Jitamaro:'s/$/xxx /'是將'xxx'追加到行尾的一種方式。在正則表達式中,'$'匹配行的末尾。你也可以使用'/ ^/xxx /'來在行的前面加上'xxx'。 – camh

+0

什麼是s /? – Bytemain

1

是的,它可以,只是引用它像往常一樣:

sed 's/foo/bar/g 
    s/baz/quux/g' 
+0

呃,不是真的。實際上,如果它們在同一行上,則必須使用半列';'分隔命令。如果命令在不同的行上,那麼不需要';'(但如果它存在的話它不會受到傷害)。 –

+0

問題是如何打破正則表達式部分。在這個例子中,搜索和替換字符串的時間很長,所以這是我想要打破的。 –

+0

這是2行動的一個切入點,並且請求即將切斷單個s ///操作。 – NeronLeVelu

1

正則表達式是不是要使用這麼長的表達,爲什麼不快捷方式是這樣的針:

sed -i 's/nbdport=2000/nbdport=2000 video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 
0

桑德拉,則還可以放在一個文件大sed命令,說tftp.sed和調用sed的像sed -i -f tftp.sed /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default其中tftp.sed文件看起來像:

# my very long line: 
s/append ro initrd=initrd.img quiet splash nbdport=2000/append ro initrd=initrd.img quiet splash nbdport=2000 video=LVDS-1:d/g 
# note: every sed command in this file must be in a separate line 

正如你可以在上面看到,你可以有sed源文件中的多個sed命令,只要確保它們分別在不同的行中即可。

+0

即使它沒有重放請求(切割長時間'單一'動作),如果請求是由於在命令行上寫入的行太長而不是在腳本中寫入,那麼這是一種可能的選擇。 – NeronLeVelu

2

這可能會爲你工作:

sed -i 's/append ro initrd=initrd.img quiet splash nbdport=2000/& video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 

string="append ro initrd=initrd.img quiet splash nbdport=2000" 
sed -i 's/'"$string"'/& video=LVDS-1:d/g' /var/lib/tftpboot/ltsp/i386/pxelinux.cfg/default 

注:在替代的右側的&代表所有匹配正則表達式的左手側

5
sed 's/[long1][long2]/[long3][long4]/' file.txt 

你可以使用普通的反斜槓用於散佈在多行表達。重要的是,反斜槓後面的行在開始時不具有空格。

sed 's'/\ 
'[long1]'\ 
'[long2]'\ 
'/'\ 
'[long3]'\ 
'[long4]'\ 
'/' file.txt 
相關問題