标签: patterns

修改 zsh 通配模式以与 cp 一起使用

我想编写一个脚本来从一个特定的文件夹递归复制文件除文件A.extnB/*.extnC/*在那里BC在目录和extn仅仅是一些通用的扩展。这就是我所拥有的:

#!/usr/local/bin/zsh
setopt EXTENDED_GLOB
TMPDIR=/tmp/test

cp -pR $(dirname $0)/**~(*.foo/*|*/bar.txt|*.abc|qux.txt) $TMPDIR
Run Code Online (Sandbox Code Playgroud)

然而,这并没有像预期的那样否定模式。我想我知道为什么——尽管模式是正确的(如 所示echo),但cp -R不知道该模式,并进入了一个“不应该”的目录,一旦进入,该模式就不再有效。

如何修改上述内容以执行我想要的操作?我想用findand是可能的xargs,但我被上面的清晰度所吸引,并且更喜欢类似的东西(但如果这是错误的方法,我会非常满意不同的解决方案)。

zsh shell-script file-copy patterns glob

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

如何从文件中删除匹配特定模式的文本

我想比较两个文件以检查它们之间的差异,fileA 和 fileB。fileA 就像一个模板文件,fileB 是我想与之比较的文件。每当我发现差异时,我都想将该差异输出到 fileC。

困难在于 fileA 和 fileB 包含某些(不是全部)行,这些​​行具有一些总是不同的数据 - 时间、日期和随机生成的 id 代码。但是,我不想将行输出到 fileC,其中唯一的区别是时间、日期和 ID 代码。

所以我想要做的是从它们出现在 fileB 中的任何行中删除时间、日期和 id 代码(我可以在 fileA 中手动执行此操作),然后与 fileB 进行比较,将不同的行输出到 fileC。

请注意,要删除的文本始终遵循特定模式。所以我可以使用带有这些模式的 grep 找到文本,但我不知道如何删除它...

这是两个文件的示例,以显示我的意思:

我想找出上述两个文件之间的差异,不考虑时间(例如 10:12:25)、日期(例如 08/20/2014)或 ID 代码(例如 123456)并将差异输出到 fileC

这两行不同,因此是第 2 行和第 3 行。第 1 行对于这两个文件是相同的。删除时间、日期和 …

grep sed awk files patterns

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

BASH:计算文档每行中的单词数

我需要识别文本文件中的模式以进行进一步分析。因此输入文件可能包含如下半结构化文本;

文件 1

905:john: abc123: john@doe.com: US  
920:eric: ericaA: eric007@gmail.com: US  
1000: rio: ri0ri0: rio@yahoo.com: IN  
Run Code Online (Sandbox Code Playgroud)

文件 2

nathen <tab> nathen@yman.com <tab> 764323545 <tab> UK
thomas <tab> thom@gmail.com <tab> 563363421 <tab> UK
ian <tab> rt@gmail.com <tab> 3453245472 <tab> SP
Run Code Online (Sandbox Code Playgroud)

每个文档的一行中的单词数可能会有所不同。分隔符也各不相同,但每个文档都是唯一的。我想要的是计算每个文档中每行的字数。

输出将是:

对于文件 1

5  
5 
5 
5   
Run Code Online (Sandbox Code Playgroud)

对于文件 2

4  
4 
4 
4
Run Code Online (Sandbox Code Playgroud)

我想对带有任何分隔符的任何文件进行概括。可能是- | : \space+ \tab+

部分文件如下:

| hetro@gmail.com | er34532 |  
| rt@gmail.com | 764474 |
Run Code Online (Sandbox Code Playgroud)

bash patterns

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

如何查找文件中包含的字符串出现的频率?

我有一个包含表单 URL 列表的文件

编辑

http://www.google.com/absd/siidfs/kfd837382 $%^$&,

www.google.com,

google.com

yahoo.com/list/page/jhfjkshdjf...

我想编写一个脚本来显示以下输出

 google.com : 2
http://www.google.com: 1
yahoo.com : 1 
Run Code Online (Sandbox Code Playgroud)

我被困在我必须从文件中读取 URL 并再次检查整个文件的部分。我是 bash 脚本的新手,因此我不知道该怎么做。

bash shell-script text-processing files patterns

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

如何根据文件名部分将文件分类到子文件夹中?

这些是目录中的文件:

Ford-Mustang-001.jpg
Ford-Mustang-002.jpg
Ford-Mustang-003.jpg

Chevy-Impala-001.jpg
Chevy-Impala-002.jpg
Chevy-Impala-003.jpg
Run Code Online (Sandbox Code Playgroud)

我想将这些分类到子文件夹中:

/Mustang
/Impala
Run Code Online (Sandbox Code Playgroud)

command-line files patterns mv

4
推荐指数
2
解决办法
1875
查看次数

如何找到具有特定字符串集的特定文件?

这是给定的文件集:

./20170524/18909-20170524182010-PBS74C2VTTCKBMKGQC7YUVEJ3U-362511-19614379.XFA.SOFS_EDI
./20170524/18909-20170524182009-PBS74C2VTTCKBMKGQC7YUVEJ3U-362514-19614381.XFA.SOFS_EDI
./20170524/18909-20170524182010-PBS74C2VTTCKBMKGQC7YUVEJ3U-362532-19614390.XFA.SOFS_EDI
./20170524/18909-20170524182009-PBS74C2VTTCKBMKGQC7YUVEJ3U-362503-19614371.XFA.SOFS_EDI
./20170524/18909-20170524182009-PBS74C2VTTCKBMKGQC7YUVEJ3U-362506-19614372.XFA.SOFS_EDI
Run Code Online (Sandbox Code Playgroud)

这是每个文件中的内容。他们有不同的AK9细分市场。像AK9*AAK9*PAK9*RAK9*E

ISA*00*          *00*          *SS*252649841464SS *01*12564486M      *102453*1254*U*025402*21651681320*0*S*>~SS*SS*5648408456SS*0150158011S*20170228*1921*020151018*X*0210540~SS*997*008609070~AK1*SH*107405~AK2*856*362518~AK5*A~AK9*A*1*1*1~SE*6*008609070~GE*1*008604488~IEA*1*008602662~
Run Code Online (Sandbox Code Playgroud)

我正在寻找具有这种模式的文件:

AK9*PAK9*RAK9*E

linux string patterns

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

如何检查文件名是否符合模式?

我的任务是编写一个 shell 脚本来检查文件名是否符合特定模式,但我不知道如何去做。

文件名应遵循如下所示的模式:

(Project-ID)_(Env)_(Source-System-ID)_(DataDescriptor)_(CCYYMMDD)_(Seq)_(Freeformat)_(codepage)
Run Code Online (Sandbox Code Playgroud)
  • Project_ID 应为字母数字且介于 3-8 个字符之间。
  • Env 应包含 3 个字符的代码(DEV、SYT、SIT、UAT 或 PRD)
  • Source-System-ID 应该是一个可变数字
  • DataDescriptor 应该是字母数字,例如 CUST
  • CCYYMMDD 应该是 CCYYMMDD 格式的日期
  • Seq 应该是一个数字,例如 01、02、03 等
  • 自由格式应该是字母数字 - 用于给文件名附加说明
  • 代码页应表示文件扩展名,例如 .ascii 或 .EBCDIC

示例文件可能如下所示:

ABC_PRD_00227_ACC_20130128_01_LTSB.CP1252
Run Code Online (Sandbox Code Playgroud)

如果文件不符合模式,最好能显示某种警告。

grep shell-script filenames patterns

2
推荐指数
1
解决办法
2319
查看次数

我应该在条件中嵌入命令还是测试其返回码?

这是一个关于最佳实践的简单问题:我应该使用哪个?

选项1

ping -c1 "$host"

if [[ $? -eq 0 ]] ; then
   command
else
   command
fi
Run Code Online (Sandbox Code Playgroud)

选项 2

if ping -c1 "$host" ; then
   command
else
   command
fi
Run Code Online (Sandbox Code Playgroud)

我知道这是一个简单的命令,但如果它变大,差异可能会很大。

bash exit patterns

2
推荐指数
1
解决办法
627
查看次数

为什么这个重命名操作不起作用?

这有效:

$ touch abcdefg
$ mv -v abcdefg abc[de]fg
‘abcdefg’ -> ‘abc[de]fg’
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

$ touch abcdefg
$ mv -v abcdefg abc[d]efg
mv: ‘abcdefg’ and ‘abcdefg’ are the same file
Run Code Online (Sandbox Code Playgroud)

为什么?

bash patterns mv

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

模式匹配

我正在尝试按照 Bash Cookbook 来了解 Bash Scripting。我正在使用正则表达式进行示例 6.8 测试。

我有以下脚本:

#!/usr/bin/env bash
# cookbook filename: trackmatch

for CDTRACK in *
do
     if [[ "$CDTRACK" =~ "([[:alpha:][:blank:]]*)- ([[:digit:]]*) - (.*)$" ]]
then
    echo ${BASH_REMATCH[2]}
else
    echo Error $CDTRACK
fi
done
Run Code Online (Sandbox Code Playgroud)

我将此应用于我目录中的几个文件:

Ludwig van Beethovern - 02 - Adagio un poco mosso.ogg

路德维希·范·贝多芬 - 01 - Allegro.ogg

我总是得到一个错误返回。问题似乎与([[:alpha:][:blank:]]*)- ([[:digit:]]*) -代码部分有关。当我确实有 if 语句时:if [[ "$CDTRACK" =~ "(.*)$" ]]那么就没有错误。

关于我做错了什么的任何想法?

我在 AWS,Bash v 4.2 上运行代码

bash shell-script regular-expression patterns

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

如何查找以 ~ 和 pyc 结尾的文件?

我想找到所有以“~”或“pyc”结尾的文件(在当前目录和所有子目录中)。为此,我尝试了以下find模式:

find . -name '*{~,pyc}'
find . -name '{*~,*.pyc}'
Run Code Online (Sandbox Code Playgroud)

但都没有列出目录中存在的任何文件。为什么这些模式不起作用?怎么做才对?

当使用ls而不是find(不带引号)时,我得到了预期的结果(除了ls只显示当前目录而不是所有子目录)。

find wildcards patterns

0
推荐指数
1
解决办法
4456
查看次数