舉例說明:
file.txt內容有:
aaa
### config-start ###
bbb
ccc
ddd
### config-end ###
eee
希望替換為
aaa
### config-start ###
111
222
333
### config-end ###
eee
也就是把file.txt中指定的內容(config-start和config-end之間的所有內容),替換為另一部分內容,這另一部分內容可能也是有多行或特殊符號的,然后指定的內容以外的內容,不能動,
也不能洗掉后追加到檔案末尾,
我想通過sed實作,但始終沒有找到辦法,望高手賜教。
uj5u.com熱心網友回復:
sed '/star/{:A;N;/end/!s/\n.*/\n111\n2222\n3333/;tA}'測驗:
# echo 'aaa
### config-start ###
bbb
ccc
ddd
### config-end ###
eee'|sed '/star/{:A;N;/end/!s/\n.*/\n111\n2222\n3333/;tA}'
aaa
### config-start ###
111
2222
3333
### config-end ###
eee
uj5u.com熱心網友回復:
可以有其它兩種方法# 創建兩個檔案
cat <<EOF > file1
aaa
### config-start ###
bbb
ccc
ddd
### config-end ###
eee
EOF
cat <<EOF > file2
123
456
789
EOF
第一種,適合替換內容不多、能手打出來的
sed '
/bbb/,/ddd/c\
123\n456\n789
' file1
# 或者
sed '
/bbb/,/ddd/c\
987\
654\
321
' file1
說明:
'c\'
'TEXT'
接收兩個地址,把兩個地址確定的范圍內的內容洗掉,并替換接下來的TEXT
TEXT的每一行用\結尾,但最后一行不需要用\
可以使用轉義字符
P.S. 也可以使用a\ TEXT,不過需要多幾個步驟
第二種方法,適合從其它檔案摘取幾行內容,大范圍替換
sed -n '1,3p' file2 | sed -e '3r /dev/stdin' -e '3,5d' file1
# or anything
echo -e "hello\nworld" | sed -e '3r /dev/stdin' -e '3,5d' file1
# or directly from file
sed -e '3r file2' -e '3,5d' file1
說明:
主要使用r FILENAME命令,'/dev/stdin'是GNU sed才可以使用的特殊檔案名,表示從標準輸入讀取,適合piping。
r先將檔案內容快取起來,當sed處理完一個輪回之后,便把快取的內容輸出
由于d命令會強制開始下一輪,所以先使用r再使用d
P.S. 所謂輪回(cycle),sed有兩個緩沖區叫pattern和hold,
sed每次從輸入流那里讀取一行、并放入pattern buffer中,
如果該行匹配上了定位符(address,比如行號、正則運算式/REGEXP/),就使用命令處理該行,
如果沒有指定address,默認處理每一行;
一般如果沒有使用-n選項的話,最后一行命令處理完之后,把pattern buffer的內容列印出來;
開始下一輪
uj5u.com熱心網友回復:
大哥,沒有想到sed還有如此高深莫測的用法,你這寥寥幾行,就夠我消化一陣了,我先研究下轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/11303.html
標籤:系統維護與使用區
下一篇:請教大佬,用VMware15安裝CentOS8.2時,遇到Error in posttrans scriptlet in rpm package kmod-kv
