Bash 如何删除分隔符后仅包含数字、特殊字符或空格的行
以下代码:Bash 如何删除分隔符后仅包含数字、特殊字符或空格的行,bash,macos,Bash,Macos,以下代码: #!/bin/bash osascript -e \ 'tell application "Google_Chrome" to tell tab 1 of window 1 \ set t to execute javascript "document.body.innerText" \ end tell' | grep ':' 产出结果: line1:blah blah line2:blah 123 line3: line4:[456] blah Line5:blah b
#!/bin/bash
osascript -e \
'tell application "Google_Chrome" to tell tab 1 of window 1 \
set t to execute javascript "document.body.innerText" \
end tell' | grep ':'
产出结果:
line1:blah blah
line2:blah 123
line3:
line4:[456] blah
Line5:blah blah
line6:[789]
line 7:
所需输出:
line1:blah blah
line2:blah 123
line4:[456] blah
我可以使用cut-d:-f1
获得左侧,使用cut-d:-f2
获得右侧。但我似乎不知道如何在保留数据结构的同时删除空行或只有数字和/或特殊字符的行
据我所知,我试图实现的目标遵循以下特定规则:
- 输出的每个有效行都包含一个
(但并非所有包含:
的行都有效):
左侧不允许有空格、特殊字符或大写字母:
- 只有小写字母,数字和下划线
[a-z]
和[0-9]
允许位于左侧:
- 应丢弃
右侧不包含字母:
的任何行。(案例不重要)[a-z]
有什么办法可以做到这一点吗?用以下内容替换您的
grep
:
... | grep -E '^[a-z0-9_]+:[^a-zA-Z]*[a-zA-Z]'
line1:blah blah
line2:blah 123
line4:[456] blah
这将满足您的要求,即只允许
[a-z0-9.]
字符位于:
的左侧,并且在:
的RHS上至少允许一个[a-zA-Z]
字符,我使用awk
已经有一段时间了,但类似于:awk-F':''{NF>1;print$0}'
?sed'/^[a-z0-9\{1,\}:.[a-zA-Z].$/!d'
awk
不起作用,但sed
完美地满足了我的需要。非常感谢。因为您已经在使用grep
来获取包含的行:
您不需要另一个sed
或awk
。只需将grep
替换为下面建议的grep
表达式就足够了,并且在您的管道中只需要一个命令。`*`不需要,因为它包含在[^a-zA-Z]*
中,上述注释中的这个和sed解决方案都非常有效。你能解释一下它们为什么会起作用,这样我就可以试着把我的大脑围绕在发生的事情上了吗?是的,我在我的回答中也添加了一些解释<代码>[a-z0-9+匹配字符类中的一个或多个给定字符[…]
:
匹配文字冒号,[^a-zA-Z]*
匹配0个或多个字符,这些字符不是字符类中的字符之一。那么如何允许在冒号右侧使用西里尔字符?使用:grep-E'^[a-z0-9+:[^a-zA-Z]*[a-zA-ZА-аа-аЁё]