我在这里遇到了一个非常微不足道的问题:如何使*bash 中的符号表示零或更多,就像在诸如sed? 之类的工具中一样?
例如,ak*应该匹配名称完全由a后跟零个或多个ks组成的任何文件。它的扩张将包括a,ak,akk,和akkk,但不会akc。
我已经unsetopt sh_glob在 zsh 和set -o noglobbash 中尝试过;他们没有产生预期的行为。
例如,我想知道\{x,y\}insed是否会尝试匹配尽可能多或尽可能少的字符。
另外,有人可以向我解释以下意外行为sed吗?
echo "baaab" | sed 's/a\{1,2\}//'
bab
echo "baaab" | sed 's/a\{0,2\}//'
baaab
Run Code Online (Sandbox Code Playgroud)
在第一行中,sed变得贪婪,在第二行中显然没有,这有什么原因吗?
我使用的是 GNU sed 4.2.1 版。
看着这个问题,我注意到awk如果文件被传送到标准输入,则无法读取用户输入,但如果从作为命令行参数给出的文件中读取输入,它的行为确实符合预期。
例如,如果您的awk脚本中有以下 BEGIN 块:
BEGIN {
printf "Enter input: "
getline var < "-"
}
Run Code Online (Sandbox Code Playgroud)
如果你像 一样运行它awk -f ./script.awk file.txt,它会提示用户输入,然后继续处理file.txt。但是,如果您像 一样运行cat file.txt | awk -f ./script.awk,我想 awk 会将它从管道中获取的内容解释为用户的输入(因此getline将填充var的第一行file.txt)。
有没有办法让awk行为就像从文件中读取一样,但在管道中使用?
我可以使用临时文件,当然,但这远不优雅。
我对这个替换正则表达式有点挣扎,我不明白它为什么会这样。我想要做的是替换最后一个之后的所有数字/:
str="aa/a0b0/42"
echo ${str/%[[:digit:]]*/5}
echo ${str/%[0-9]*/5}
Run Code Online (Sandbox Code Playgroud)
两者都作为输出echo产生aa/a5。预期的输出将是aa/a0b0/5。
我很清楚我可以使用诸如sed和 之类的工具awk来解决我的问题,而且我确实知道该怎么做,但我正在寻找一种仅使用 bash 的解决方案。
我想了解为什么[0-9]*扩展到 0b0/42 而不仅仅是数字。
将%在我的正则表达式是让后端更换。
伙计们,我想知道是否存在只突出显示输入文本的某些部分的命令,而不是像grep这样过滤它。
举个例子,假设以下输入文本:
foo bar
gaz das
xar
Run Code Online (Sandbox Code Playgroud)
grep "bar\|gaz" input将打印前两行,突出显示bar和gaz,但不会显示xar。
我知道我可以简单地为-C参数设置一个大常量,因此它会“始终”显示上下文,例如: grep -C1000 "bar\|gaz" input,但我不确定这是否有效,或者是否有更好的工具。
我想知道如何获取网络接口的掩码。用ifconfig它很简单,但我必须使用该ip工具,并且ip addr show没有向我展示我想要的东西。
下面是一个输出示例ip addr:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)
另外,那个 brd 字段是什么?
shell ×3
awk ×1
bash ×1
command-line ×1
grep ×1
highlighting ×1
ip ×1
pipe ×1
sed ×1
wildcards ×1