标签: patterns

如何从bash中的字符串/数组创建唯一元素数组?

如果我有一个字符串“1 2 3 2 1” - 或一个数组 [1,2,3,2,1] - 我如何选择唯一值,即

"1 2 3 2 1" produces "1 2 3" 
Run Code Online (Sandbox Code Playgroud)

或者

[1,2,3,2,1] produces [1,2,3]
Run Code Online (Sandbox Code Playgroud)

类似于 uniq 但 uniq 似乎适用于整行,而不是一行内的模式......

array string uniq patterns

9
推荐指数
3
解决办法
1万
查看次数

如何使用`sed`匹配精确的字符串?但不是它的一部分。?

我有一个输入文件FILE1.TXT如下。


11 id1  
12  
13 AGE = 20  
14 NAME = NAME1  
15  
16 id2  
17  
18 AGE = 30  
19 NAME = NAME2  
.  
.  
.  
110 idXYZ  
111  
112 AGE = AGEXYZ  
113 NAME = NAMEXYZ  
114  
115 idZZZ  
116
Run Code Online (Sandbox Code Playgroud)

我想搜索属于特定Id 的所有字段并获取NAME的值

我设法遍历每个Id并根据需要为每个Id形成以下命令。

sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'

这里的问题是,我得到了输出NAME1,除此之外,我还得到了NAMEXYZ

应该改变什么,以便我只得到NAME1而不是NAMEXYZ

作为解决方法,以下命令有效。 …

sed string patterns

8
推荐指数
2
解决办法
3万
查看次数

Bash Globbing 不符合预期

一道作业题:

匹配所有以小写字母开头但不以大写字母结尾的 2 个或更多字符的文件名。

我不明白为什么我的解决方案不起作用。

所以我执行了以下操作:

touch aa
touch ha
touch ah
touch hh
touch a123e
touch hX
touch Ax

ls [a-z]*[!A-Z]
Run Code Online (Sandbox Code Playgroud)

输出:

aa  ha
Run Code Online (Sandbox Code Playgroud)

我的问题:为什么它不匹配“ah”、“hh”或“a123e”?

bash wildcards patterns

8
推荐指数
1
解决办法
818
查看次数

模式匹配排除重复字符

以下是否有正则表达式匹配字符集中的字符但只匹配一次?换句话说,一旦找到一个字符,就把它从集合中删除。

如果 grep 不能做到这一点,是否有内置的实用程序可以做到这一点?

例子:

Characters to match only once:   spine
Run Code Online (Sandbox Code Playgroud)

输入:

spine
spines
spin
pine
seep 
spins
Run Code Online (Sandbox Code Playgroud)

输出:

spine
spin
pine
Run Code Online (Sandbox Code Playgroud)

编辑:
有很多方法可以实现这个输出(下面的一个例子),但我正在寻找一种方法来做到这一点,而不必为我想要匹配的每个模式自定义命令。

grep '[spine]' input_file | grep -v 's.*s' | ... | grep -v 'e.*e'

grep regular-expression patterns

7
推荐指数
1
解决办法
5137
查看次数

ls 模式匹配

我知道这[]ls模式匹配中起作用:

$ ls
foo.c  foo.h
$ ls foo.[ch]
foo.c  foo.h
Run Code Online (Sandbox Code Playgroud)

但我找不到记录在哪里。

我想知道与这些匹配的语法:

$ ls
foo.asd  foo.qwe
Run Code Online (Sandbox Code Playgroud)

这是我最好的猜测:ls foo.[{asd}{qwe}]。这没用。

ls shell wildcards patterns

7
推荐指数
1
解决办法
9839
查看次数

仅使用 grep 查找第一次出现

假设我有一个包含很多单词的文件,我只想找到模式为“xyz”的第一个单词。如果同一行中有多个具有此模式的单词,我该怎么办? -m返回匹配的第一行中的所有单词。我只需要 grep 命令。

grep patterns

7
推荐指数
1
解决办法
4万
查看次数

grep 多个正则表达式,并计算出现次数

说,我有一个文件,必须在其中搜索多个正则表达式,并且必须计算每个正则表达式的匹配数。

因此,我无法组合这些模式:

grep -Po '{regex_1}|{regex_2}|...|{regex_n}' file | wc -l
Run Code Online (Sandbox Code Playgroud)

... 因为需要每个正则表达式的出现次数。

我显然可以:

occurences[i]=$(grep -Po "${regex[i]}" file | wc -l)
Run Code Online (Sandbox Code Playgroud)

...但不幸的是,遇到的文件可能非常大(> 1 GB)并且有许多模式(在数千个范围内)需要检查,这使得该过程非常缓慢,因为对同一文件进行多次读取涉及。

有没有办法快速做到这一点?

grep search regular-expression patterns

6
推荐指数
1
解决办法
1623
查看次数

删除包含特定文本的列

我正在寻找一个选项来删除具有特定文本的列,例如

“滴滴”

aaa bbb ccc ddd eee fff
1   2   3   4   5   6
2   3   4   5   6   0
Run Code Online (Sandbox Code Playgroud)

所以输出看起来像这样:

aaa bbb ccc eee fff
1   2   3   5   6
2   3   4   6   0
Run Code Online (Sandbox Code Playgroud)

我知道有一个简单的选项可以删除第 4 列并且可以完成相同的工作,但是我的 *.csv 文件没有排序。有任何想法吗?

sed awk patterns columns

6
推荐指数
2
解决办法
5197
查看次数

匹配小于前一个匹配的下一个模式

我有一个带有二维码行的文件,我只想grep为那些子序列长度不增加的文件。例子:

这个很好,因为下一个序列与前一个序列更少或相同:

####### ###### ### ### ## # # #
Run Code Online (Sandbox Code Playgroud)

这个是错的:

### ## ## ### ### ### ###### ##
Run Code Online (Sandbox Code Playgroud)

我是这样开始的:

egrep "[^#](####)+[ ]+(##)+" qr.txt
Run Code Online (Sandbox Code Playgroud)

但后来我意识到不可能继续了..

regular-expression patterns

6
推荐指数
1
解决办法
329
查看次数

查找命令:-or 选项不起作用

我想为匹配模式的每个文件执行一个命令。但是似乎正确的命令对我不起作用,我不知道为什么。

$ find . -type f -name '*.c' -or -name '*.h' -or -name '*.cpp' -exec ls {} \;
$ ls
script.sh  test.c  test.h
Run Code Online (Sandbox Code Playgroud)

find wildcards patterns

5
推荐指数
1
解决办法
6343
查看次数

标签 统计

patterns ×10

grep ×3

regular-expression ×3

wildcards ×3

sed ×2

string ×2

array ×1

awk ×1

bash ×1

columns ×1

find ×1

ls ×1

search ×1

shell ×1

uniq ×1