我正在研究的大多数命令行工具都能够选择字段分隔符。但是,我想选择一个分隔符作为开始,并选择一个不同的分隔符来结束我想要从正在处理的每一行中删除的文本段。
1text [blah blah blah] text number punctuation text text
2text text text
3text text (text) [blah blah blah] number text
4text <url> <email> text [blah blah blah] text
我想从这些行中删除所有的“blah blah blah”。
Blah 可以包含任何内容,除了换行符、EOF 和其他断断续续的内容以及“[”。即:我不应该在任何数据中包含“[[”(也不应该有“[blah[”)
我每行只有一个(可选)[] 实例。因此,对于第 2 行,没有任何内容需要删除,并且这不应导致暂停、停止或失败。
我几乎 100% 肯定,如果我有一个开始 '[',那么我也有一个 ']'。不过,检查一下可能会很好。
还有其他形式的标点符号,所以我不想将其与仅查找非字母数字内容以开始删除的内容一起使用(即:第 4 行)
能够弄清楚我是否在该特定点将两个(现在相邻的)空格放在一起的奖励点 - 但没有删除任何其他点的双空格。
我很确定我必须使用 awk 或 sed,但如果有一种方法可以通过常规命令行工具来完成此操作,使其尽可能可移植,那将是理想的。
另外,解释你在做什么(如果你使用正则表达式/sed)肯定会有所帮助,因为:
一条建议这里说:
sed 's/^.*%\([^ ]*\) .*\$\([^$]*\)$/\1 \2/' infile
我用这种胡闹的方式进行了一些工作:
cat data | sed 's/^.*\[\([^ ]*\) .*\]\([^$]*\)$/\1 \2/'
然而,它并没有去掉整个“blah blah blah”,而是留下了一个额外的换行符。
并没有真正回答一般意义上的问题(或者,至少我在读完它后无法弄清楚 - 也许只是失败我的部分),但似乎(也)专门针对该人的数据量身定制。
答案1
这很简单。您不需要这样的分隔符,一个简单的正则表达式就可以了。只需寻找一个开头[
,后面跟着尽可能多的非]
或[
字符,直到行尾。例如:
Perl
如果你知道没有
[[
或者有其他奇怪的事情:perl -pe 's/\[.+?\]//g' file
如果你能有奇怪的事情:
perl -pe 's/\[[^\[\]]*\]//g' file
sed
sed 's/\[[^]]*\]//g' file