![](/img/trans.png)
[英]Replace a section of code in .profile with a file using sed or awk
[英]Replace section of text file using sed/awk
我正在嘗試替換#開始和#結束之間的文件中的文本,如下所示:
# begin
# [block]
# param1=""
# param2=""
# end
讀為:
# begin
[block]
param1="value1"
param2="value2"
# end
基本上,我不注釋[block]行以及它下面的參數值。
使用Mac OS X的BSD sed 1來避免不必要的循環的更簡單的解決方案:
/# begin/,/# end/ { # Search only within this range of text.
//!s/^# // # Excluding range borders, delete /^# / from each line.
}
測試:
▶ cat > FILE <<EOF
aaa
bbb
# begin
# [block]
# param1=""
# param2=""
# end
ccc
ddd
EOF
▶ sed -i '' '/# begin/,/# end/{//!s/^# //;}' FILE
▶ cat FILE
aaa
bbb
# begin
[block]
param1=""
param2=""
# end
ccc
ddd
進一步說明:
//
重復最后一個正則表達式匹配。 因此, //!
否定這一點。 和/PAT1/,/PAT2/{ //! X }
/PAT1/,/PAT2/{ //! X }
具有不含兩者的效果/PAT1/
和/PAT2/
對X
。 1並且還使用GNU sed進行了測試。
通過sed:
sed '/^# begin/,/^# end/{/^# \(begin\|end\)/b a;s/^# *//; :a}' your_file > new_file
這有點復雜:
/^# begin/,/^# end/ # match from begin to end
{
/^# \(begin\|end\)/b a; # if it's begin or end, jump to label a
s/^# *//; # delete all sharps
:a # label a locates at the end
}
演示:
$ cat f
# begin
# [block]
# param1=""
# param2=""
# end
$ sed '/^# begin/,/^# end/{/^# \(begin\|end\)/b a;s/^# *//; :a}' f
# begin
[block]
param1=""
param2=""
# end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.