例如,使用 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) 我有一个文件,其日期从 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) 我正在编写一个脚本,该脚本将字符串作为输入以及用户可以通过使用参数作为指示符来选择的其他选项。换句话说,是这样的:
./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)
那么我该如何解决这个问题呢?
在有效的shell \\u
(bash +4.3、ksh93 或 zsh)中,我们可以打印 Unicode 字符:
$ 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
。
和\\u9f
(\\u9c
APC 和 ST)都是C1
控制字符。
$ 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
正在生成所有字符,并且将输出重定向到其他软件(而不是终端)将显示生成的字符:
$ printf …
Run Code Online (Sandbox Code Playgroud) 只是玩正则表达式来学习。为什么它与其他文件匹配: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 …
为什么 += 在脚本中用作串联?
while read t
do
t+=2
echo $t
Run Code Online (Sandbox Code Playgroud)
我在末尾添加了 2...为什么?
时间戳(用外行术语来说)可以是一个 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)