小编Qua*_*tal的帖子

为什么空匹配正则表达式在 sed 和 grep 中的工作方式不同?

例如,使用 Debian 或 Debian 派生系统上的工具,像 之类的正则表达式N*可以匹配空字符串,可能会导致 sed 中的匹配:

$ echo 'Hello' | sed 's/N*/ xx&xx /g'
  xxxx H xxxx e xxxx l xxxx l xxxx o xxxx
Run Code Online (Sandbox Code Playgroud)

这是每个字符串字符之前的空匹配(因此是xxxx字符串,中间没有字符xx&xx)的正确结果(在 中 6 次Hello。尾随换行符不算在内,它不匹配)。

并且,如果任何字符(或字符组)匹配,它将出现在xx和之间xx

$ echo  'Hello' | sed 's/e*/ xx&xx /g'
 xxxx H xxexx l xxxx l xxxx o xxxx
Run Code Online (Sandbox Code Playgroud)

但是,grep 中的相同正则表达式不会匹配空字符串:

$ echo 'Hello' | grep -o 'N*'

Run Code Online (Sandbox Code Playgroud)

但只会打印非空匹配:

$ echo 'Hello' | grep -o …
Run Code Online (Sandbox Code Playgroud)

grep sed regular-expression

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

编写一个正则表达式,其输出仅是 01/03/2021 - 01/03/2020 范围内的行

我有一个文件,其日期从 01/01/2020 到 04/04/2021 我想通过使用egrep 仅获取 01/03/2020 到 01/03/2021 之间的日期。我尝试做

egrep "([0][1-9]|[1-2][0-9]|[3][0]/[0][3-9]|[1][0-2]/[2][0][2][0-1])$" dates.txt
Run Code Online (Sandbox Code Playgroud)

但它仍然给我文件中的所有日期:

$ cat dates.txt 
01/01/2020
24/01/2020
04/02/2020
23/02/2020
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
25/03/2021
04/04/2021
Run Code Online (Sandbox Code Playgroud)

linux grep text-processing

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

getopts 参数可以与其他输入结合使用吗?

我正在编写一个脚本,该脚本将字符串作为输入以及用户可以通过使用参数作为指示符来选择的其他选项。换句话说,是这样的:

./script "My input string" -pxz
Run Code Online (Sandbox Code Playgroud)

或者

./script -pxz "My input string"
Run Code Online (Sandbox Code Playgroud)

但我遇到了以下问题。输入非 getopts 样式的参数后, getopts 命令似乎停止工作。检查一下,例如:

#!/bin/bash

while getopts "ab" arg; do
    echo $arg received
done
Run Code Online (Sandbox Code Playgroud)

当我们运行它时,我们得到:

$ ./example.sh -a -b -a string -b
a received
b received
a received
$
Run Code Online (Sandbox Code Playgroud)

它停在“string”处并且不会继续。getopts 命令返回非零退出状态,因为“string”不是它期望读取的参数类型,并且 while 循环结束。我尝试添加第二个,while getopts但这没有任何作用。getopts 的“读头”仍然停留在该“字符串”参数上,并且将再次以非零退出状态退出。

这意味着,看起来,我无法让用户先输入字符串,然后输入选项,因为 getopts 永远无法读取字符串并到达那里。所以我不能这样做:

./script "My input string" -pxz
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我告诉用户首先输入他们的选项,然后输入字符串,我就会遇到如何检索字符串的问题。通常,如果没有选择,我会这样做:

string="$1"
Run Code Online (Sandbox Code Playgroud)

但现在由于有选项,而且我不知道有多少个,我不再知道字符串占据什么位置。那么我怎样才能找回它呢?

现在,理想情况下,我的脚本实际上应该能够以这两种方式甚至两者的组合来工作。它应该能够处理如下输入:

./script -p "My input string" -xz
Run Code Online (Sandbox Code Playgroud)

那么我该如何解决这个问题呢?

bash shell-script getopts

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

角色要去哪里?

在有效的shell \\u(bash +4.3、ksh93 或 zsh)中,我们可以打印 Unicode 字符:

\n
$ printf \'a b c \\ua0 \\ua1 \\ua2 \\ua3 \\n\'\na b c   \xc2\xa1 \xc2\xa2 \xc2\xa3\n
Run Code Online (Sandbox Code Playgroud)\n

这是Latin-1_Suplement范围中的一些字符。

\n

然而,一旦9f添加了 Unicode 字符,打印就会停止,直到打印出 Unicode 9c

\n

\\u9f\\u9cAPC 和 ST)都是C1控制字符

\n
$ printf \'a b c \\u9f d e f \\u9c \\ua0 \\ua1 \\ua2 \\ua3 \\n\'\na b c  \xc2\xa0 \xc2\xa1 \xc2\xa2 \xc2\xa3 \n
Run Code Online (Sandbox Code Playgroud)\n

角色肯定会消失。

\n

可以肯定的是,它printf正在生成所有字符,并且将输出重定向到其他软件(而不是终端)将显示生成的字符:

\n
$ printf …
Run Code Online (Sandbox Code Playgroud)

shell bash terminal control-characters

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

为什么这个正则表达式会匹配奇怪的文件?

只是玩正则表达式来学习。为什么它与其他文件匹配:errsort、pytest.py 等?在第二行末尾添加一个问号匹配另外两个文件。也尝试过 grep 基本表达式。

谢谢!

$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)"
aa       aaaa       aabb     aabbaa     aabbbb    aabbccdd  aabbccddcc  
aabbddbb
aaccaa   aaccdd   aaddaa   aaddccddccdd  aaddee  errsort   pytest.py   TEST
$ ls -x | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)?"
aa       aaaa     aabb    aabbaa        aabbbb  aabbccdd  aabbccddcc  aabbddbb
aaccaa   aaccdd   aaddaa  aaddccddccdd  aaddee  errsort   pytest.py   TEST
test.sh  vimtest

$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
$ grep --version
grep (GNU grep) 3.7
Run Code Online (Sandbox Code Playgroud)
$ ls | egrep -i "(aa)(dd)?(cc)?(dd)?((bb(ccdd)?(bb)?)?)|(ccdd)"
 aa 
aaaa 
aabb 
aabbaa 
aabbbb 
aabbccdd …

grep

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

为什么 += 运算符无法增加值?

为什么 += 在脚本中用作串联?

while read t
do
    t+=2
echo $t
Run Code Online (Sandbox Code Playgroud)

我在末尾添加了 2...为什么?

shell scripting

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

如何使 awk 能够感知时区?

时间戳(用外行术语来说)可以是一个 ISO8601 字符串(通常是 POSIX 指定格式的输出%FT%T),并添加了一个区域字符串(宽松地说,是日期中可用的两种格式之一,或者%Z%z

然后,时间戳字符串变成特定的“时间点”,即不具有未定义的本地时间(具有至少24个不同的可能的不同值)。

这样的“时间点”字符串可以转换为纪元值(格式的结果+'%s'),而不会丢失信息。

例如,输入位于第 1 列和第 2 列,输出位于第 3 列和第 4 列:

$ cat indate
2020-03-02T12:23:34 UTC         1583151814  2020-03-02T06:23:34CST-0600
2020-03-02T12:23:34 Z           1583151814  2020-03-02T06:23:34CST-0600
2020-03-02T12:23:34 EST         1583169814  2020-03-02T11:23:34CST-0600
2020-03-02T12:23:34 CST         1583173414  2020-03-02T12:23:34CST-0600
2020-03-02T12:23:34 AST         1583166214  2020-03-02T10:23:34CST-0600
2020-03-02T12:23:34 ADT         1583162614  2020-03-02T09:23:34CST-0600
2020-03-02T12:23:34 EDT         1583166214  2020-03-02T10:23:34CST-0600
2020-03-02T12:23:34 BST         1583148214  2020-03-02T05:23:34CST-0600
2020-03-02T12:23:34 IST         1583132014  2020-03-02T00:53:34CST-0600
2020-03-02T12:23:34 +00:00      1583151814  2020-03-02T06:23:34CST-0600
2020-03-02T12:23:34 -0400       1583166214  2020-03-02T10:23:34CST-0600
2020-03-02T12:23:34 -0800       1583180614  2020-03-02T14:23:34CST-0600
2020-03-02T12:23:34 +06:00      1583130214 …
Run Code Online (Sandbox Code Playgroud)

awk text-processing date

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