Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何删除分隔符后仅包含数字、特殊字符或空格的行_Bash_Macos - Fatal编程技术网

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А-аа-аЁё]