簡體   English   中英

使用sed / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM