我有一个巨大的文本。我想删除所有只有一行的行.
。
输入示例:
abc.google.org
yahoo.com
abc.yahoo.in
abcd.bing.com
abcd.xyz.bing.uk
abcd.xyz.mnp.bing.uk
stackexchange.com
yas.sxs.sxs.zs.sxstackexchange.com
预期输出:
abc.google.org
abc.yahoo.in
abcd.bing.com
abcd.xyz.bing.uk
abcd.xyz.mnp.bing.uk
yas.sxs.sxs.zs.sxstackexchange.com
我非常感谢您提供的任何帮助。
答案1
awk -F'.' 'NF!=2' infile
如果这些行仅包含两个字段(即仅找到一个点的行),则不打印这些行。可以使用-F
选项指定字段分隔符。
或使用 gsub() 函数:
awk 'gsub(/\./, ".")!=1' infile
如果点字符(与其自身)成功替换的次数不是一次,则打印它。
答案2
就像是
grep -v '^[^.]*\.[^.]*$' input.txt
打印所有执行此操作的行不是匹配在一行中查找单个句点的 RE。
答案3
这是我的 sed 解决方案,它使用与 @shawn 的 grep 相同的正则表达式:
sed -i.bak '/^[^.]*\.[^.]*$/d' FILE
它具有直接处理 FILE 的(可疑的)优点(但它确实使用原始内容写入 FILE.bak)。由于其锚点 ^ 和 $,正则表达式占据整行。如果该行由一个带有零个或多个非点的字符串组成[^.]*
,后跟一个点,后跟零个或多个非点[^.]*
,则它将被删除。
使用示例输入进行测试。
答案4
POSIX sed:
- 至少有两个点的行打印 n 下一步。
- 剩下的就是只有一个点或没有点的直线。其中,删除带点。
sed -e '/\..*\./b' -e '/\./d' file
GNU awk:
- 删除除点之外的所有内容并记录所得字符串的长度并与一个进行比较。
awk 'length(gensub(/[^.]/,"","g",t=$0))-1' file
GNU sed:
- 将线存放在保留空间中以供以后使用。
- 尝试删除一个点。
- 如果失败,请打印行并继续阅读。
- 如果没有剩余的点 => 原始点中只有一个点。因此将其删除。
- 否则,检索原始行,因为它有 > 1 个点。
sed -e 'h;s/\.//;T;//!d;g' file
珀尔:
- 当点转写数为 1 时,指定列表分隔符($,),默认值为空字符串。
- -p 选项将自动打印当前记录。
perl -pe 'y|.||-1||($_=$,)' file
Python:
- 列表理解与 if 子句一起选择那些分成两个或多个字段或无字段的行。
python3 <<\eof
with open('file') as f:
print(*[l for l in f if len(l.split('.')) != 2],sep='',end='')
eof
标准 grep,其中多个 -e 语句表示 ORing
$ grep -e '\..*\.' -e '^[^.]*$' file