简而言之,我本能地写了一个这样的命令来查找这两个文件prefix.ext并prefix_suffix.ext沿着层次结构向下查找
find /some/path -type f -name 'prefix?(_suffix).zip'
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
由于man find, under-name patter将模式称为“shell 模式”,因此我想知道是否可以控制应使用哪种模式,特别是是否extglob可以使用选项。
我正在尝试统计 git diff 的插入和删除。
我有以下内容,当通过管道传输一个或多个形式的字符串时"4 files changed, 629607 insertions(+), 123 deletions(-)"可以计算总数:
grep -Eo 'changed, ?(\d+) insertion.*(\d+) deletion' | awk '{ i+=$2; d+=$4 } END { print "insertions: ",i," deletions: ",d }'
Run Code Online (Sandbox Code Playgroud)
这会产生insertions: 629607 deletions: 123
然而,有时 diff 并不遵循上述格式,而是只有插入或只有删除。
在这些情况下,我不需要匹配两个数字,而只需要匹配一个(并确保它最终出现在右列中)。
如何创建一个足够灵活的正则表达式来处理这些变化,并且生成可以awk正确计数的输出?
我已经看到以下模式在几个地方(甚至在 SOF 上)用作电子邮件 ID 验证的示例。
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b
Run Code Online (Sandbox Code Playgroud)
以上摘自https://www.regular-expressions.info/tutorial.html,以及引用
this pattern describes an email address.
Run Code Online (Sandbox Code Playgroud)
这种模式不考虑小写字母(除非我遗漏了一些东西)。
我对这个模式有什么进一步的了解吗?由于这种模式不能真正用于生产?为什么如此受欢迎?
所以,假设我有以下模式:
Thisisatest="1"
Run Code Online (Sandbox Code Playgroud)
在一个名为file.
我想匹配上面的确切字符串,但无论出于何种原因,我选择循环列表中的一些数字,将它们用作变量并尝试执行以下操作:
Thisisatest="$varhere"
Run Code Online (Sandbox Code Playgroud)
上面$varhere等于上面的数字,是1。(虽然我提到了循环数字,但这只是一个未来可能的用例,仍然是一个例子)
现在为了让事情变得更简单,假设我想在使用上述变量及其内容时匹配上述精确模式:
grep 'Thisisatest="$varhere"' file
Run Code Online (Sandbox Code Playgroud)
其中文件包含字符串Thisisatest="1"并$varhere包含数字1。
问题是,这行不通,因为在单引号之间(如上)不会发生变量扩展。
这是反击失败的尝试:
echo "${varhere/[0-9]*/Thisisatest=\"$varhere\"}"
Run Code Online (Sandbox Code Playgroud)
在这里我echo用来查看它是否输出正确的字符串,以便它可以用作 grep 的输入......它输出这个:
'Thisisatest="'1'"
Run Code Online (Sandbox Code Playgroud)
echo "'Thisisatest="${varhere}"'"
Run Code Online (Sandbox Code Playgroud)
输出:
'Thisisatest='1''
Run Code Online (Sandbox Code Playgroud)
echo ''''Thisisatest=\"${varhere}\"''''
Run Code Online (Sandbox Code Playgroud)
输出:
Thisisatest="'1'"
Run Code Online (Sandbox Code Playgroud)
其余的很明显......现在上面的最后一次尝试似乎接近我想要的,但仍然不是。
有什么办法可以做到以上几点?
我需要找到.php不.pl包含一个字符串(例如aaa)但包含另一个字符串(例如bbb)的文件。
我目前正在使用这个命令:
find /path/ \( -iname '*.php*' -or -name '*.pl*' \) -exec sh -c 'grep -l -v "aaa" {} | grep -l "bbb" {}' \; > resulttofile
Run Code Online (Sandbox Code Playgroud)
大约有 50 万个文件需要搜索,所以我想知道,
awkorsed代替grep- 或者可能只是一种组合grep而不是两种。该系统是 Debian GNU/Linux。
我正在尝试仅打印通过正则表达式找到的匹配单词。下面,我想要OPENSSL_NO_*源代码中存在的所有选项:
$ grep -IR OPENSSL_NO
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_CMS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_EC
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_OCSP
fuzz/asn1.c:#ifndef OPENSSL_NO_TS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_DSA
...
Run Code Online (Sandbox Code Playgroud)
当我尝试通过仅打印完整单词来修剪输出时:
$ grep -oIR "OPENSSL_NO*"
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
fuzz/asn1.c:OPENSSL_NO
...
Run Code Online (Sandbox Code Playgroud)
当我尝试 awk 时,它会打印整行:
$ grep -IR OPENSSL_NO | awk '/OPENSSL_NO[_A-Z0-9_]/{ print $0 }'
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_RFC3779
fuzz/asn1.c:#ifndef OPENSSL_NO_CMS
fuzz/asn1.c:#ifndef OPENSSL_NO_DH
fuzz/asn1.c:#ifndef OPENSSL_NO_EC
...
Run Code Online (Sandbox Code Playgroud)
和:
$ grep -IR OPENSSL_NO | awk '/\<OPENSSL_NO\>'
awk: line 1: runaway regular expression /\<OPENSSL_ ...
Run Code Online (Sandbox Code Playgroud)
和: …
在下面的代码中,2不应与 匹配21,但它给出了“匹配”的结果。
如何检查SOURCE值是否在LIST?
LIST="1,21,3,4"
SOURCE="2"
if echo "$LIST" | grep -q "$SOURCE"; then
echo "matched";
else
echo "no match";
fi
Run Code Online (Sandbox Code Playgroud) 假设我生成了两个目录,每个目录中都有文本文件,如下所示
mkdir "Directory1"
mkdir "Directory2"
touch "Directory1/fileclass1_"{1..5}".txt"
touch "Directory1/fileclass2_"{1..5}".txt"
touch "Directory2/fileclass1_"{1..5}".txt"
touch "Directory2/fileclass2_"{1..5}".txt"
Run Code Online (Sandbox Code Playgroud)
假设我通过执行以下操作来验证所有文件都在里面
A=( "Directory1" "Directory2" )
B=( "fileclass1" "fileclass2" )
for a in "${A[@]}"; do
for b in "${B[@]}"; do
for i in {1..5}; do
name="${a}/${b}*${i}.txt"
[[ ! -e $name ]] && echo "$name Does Not Exist"
done
done
done
Run Code Online (Sandbox Code Playgroud)
这返回
Directory1/fileclass1*1.txt Does Not Exist
Directory1/fileclass1*2.txt Does Not Exist
...
Run Code Online (Sandbox Code Playgroud)
但是,如果我用单括号替换双括号,我得到
A=( "Directory1" "Directory2" )
B=( "fileclass1" "fileclass2" )
for a in "${A[@]}"; do
for b in "${B[@]}"; …Run Code Online (Sandbox Code Playgroud) 一个文件中可能有以下两种情况a.txt::
情况1:
V1=last #case insensitive
V2=Last #case insensitive
Run Code Online (Sandbox Code Playgroud)
案例2:
V1=last #case insensitive
V2=LastNum #case insensitive
Run Code Online (Sandbox Code Playgroud)
我需要检查两者是否V1在V2任何给定时间都不相同。
V1并且V2也可以分配任何数字。
我正在使用下面的代码,但在第二种情况下失败:whenV1=last和 V2=LastNum。情况 2 的预期输出是:Not Same。
if [[ ( "${V1}" =~ [Ll][Aa][Ss][Tt] && "${V2}" =~ [Ll][Aa][Ss][Tt]$ ) || ( "${V1}" == "${V2}" ) ]];then
echo "V1 and V2 are same"
else
echo "Not Same"
fi
Run Code Online (Sandbox Code Playgroud)
非常欢迎任何帮助!提前致谢!
我有一个txt文件,看起来像这样,
1:Ana:apple:08:00:wait
1:Joe:banana:08:30:wait
1:Oscar:orange:08:45:ready
1:Monica:apple:08:50:ready
1:Mark::orange:ready
Run Code Online (Sandbox Code Playgroud)
我必须找到只包含两个单词“banana”和“wait”的第一行,然后用$myvar替换整行
到目前为止我已经尝试过这段代码,但我认为我在同时匹配 2 个单词时遇到一些问题。
sed -i "0,/banana.wait/c\$myvar" myfile
Run Code Online (Sandbox Code Playgroud)
感谢任何可以帮助我的人