我有一个简单的 sed 命令,用于替换(包括)//thistest.com--
和--thistest.com
之间的所有内容 nothing (删除所有块一起):
sudo sed -i "s@//thistest\.com--.*--thistest\.com@@g" my.file
my.file
的内容是:
//thistest.com--
zone "awebsite.com" {
type master;
file "some.stuff.com.hosts";
};
//--thistest.com
由于我使用@
作为正则表达式的分隔符,因此我不需要转义/
个字符。我也正确地(我认为)逃避了.
中的.com
。所以我不确切地知道失败的原因。
为什么整个区块都没有被替换?
答案 0 :(得分:4)
你有两个问题:
因此,以下内容适用于GNU和BSD风格的发布语料库:
sed '\@^//thistest\.com--@, \@^//--thistest\.com@ d' /tmp/corpus
请注意,在此版本中,我们告诉sed匹配两个模式之间的所有行(包括两个模式)。每个地址模式的开始分隔符都已正确转义。对于删除,该命令也已更改为d
而不是替换的s
,并且为了便于阅读,添加了一些空格。
我还选择将地址模式锚定到每行的开头。您可能会或可能不会发现对此特定语料库有帮助,但通常明智的做法是,如果可以,并且似乎不会伤害您的用例。
答案 1 :(得分:0)
# separation by line with 1 s//
sed -n -e 'H;${x;s#^\(.\)\(.*\)\1//thistest.com--.*\1//--thistest.com#\2#;p}' YourFile
# separation by line with address pattern
sed -e '\#//thistest.com--#,\#//--thistest.com# d' YourFile
# separation only by char (could be CR, CR/LF, ";" or "oneline") with s//
sed -n -e '1h;1!H;${x;s#//thistest.com--.*\1//--thistest.com##;p}' YourFile
注意: