我的数据格式如下:
1 "hi"
2 "hello"
3 "abc"
4-"def"
5(-hjs
6 "there"
abc" "def"
7 "there1"
标签分隔1和“hi”。另一个标签分隔2和“你好”,而在3和“abc”之间没有这样的分离。类似地,对于4-“def”和5(-hjs。
我想删除标签不分隔数字和字符串的所有行。我希望我的输出具有以下形式。
1 "hi"
2 "hello"
6 "there"
7 "there1"
我试图只使用grep'^ * [0-9]'存储那些包含数字的行(尽管它删除了abc,但它无法删除其余的)。但是,它会删除所有行。是否可以使用linux命令/ python删除指定的行。
我尝试通过检查是否存在拆分而在python中执行..但是拆分对于“abc”def“
形式的模式不起作用我正在使用制表符('\ t')进行制表......那么我该如何合并呢...也可以请你解释一下
答案 0 :(得分:2)
s = """
1 "hi"
2 "hello"
3 "abc"
4-"def"
5(-hjs
6 "there"
abc" "def"
7 "there1"
"""
import re
for line in s.splitlines():
if not line:
continue # skip empty lines
if re.match(r'^\d\t\S+', line):
print line
输出:
>>>
1 "hi"
2 "hello"
6 "there"
7 "there1"
说明:
正则表达式模式尝试匹配该行。
^
:这意味着字符串(或行)的开头\d
:这意味着匹配单个数字字符\t
:这意味着匹配制表符。\S+
:这意味着至少匹配一次非空格字符您可以将正则表达式更改为:r'^\d\s{4,}\S+'
添加\s{4,}
表示空白字符至少4次(这是大多数表格的默认字符长度)。
您还可以将它们组合成一个正则表达式,该表达式可以处理将标签转换为空格的情况:r'^\d(\t|\s{4,})\S+'
这会添加一个组,该组将查找\t
或\s{4,}
。它涵盖了你所有的基地。
答案 1 :(得分:2)
如果您的grep版本支持perl
正则表达式语法,则可以使用它:
grep -P '^\d+\t+\S+' infile
它匹配行(^
)的开头,一个数字(\d+
)后跟一个或多个标签(\t+
),后跟一个非空格字符({{ 1}})。
它产生:
\S+
答案 2 :(得分:1)
尝试
grep '^[0-9]*\s\{4\}'
(假设您使用4个空格进行制表,就像您粘贴的示例一样。)
答案 3 :(得分:1)
使用awk
:
awk '/^[0-9]+\t/' file
仅打印以一个或多个号码[0-9]+
开头的行,后跟一个标签\t