小编Ant*_*yBB的帖子

解释删除重复字段行的sed表达式

我正在研究如何在不使用 Bash 中的递归的情况下生成一组数字的所有非重复排列,我发现这个答案有效,但我想了解原因。

假设您有三个数字:1、2、3。

以下命令将生成所有可能的非重复排列:

printf "%s\n" {1,2,3}{1,2,3}{1,2,3} | sort -u | sed '/\(.\).*\1/d'
123
132
213
231
312
321
Run Code Online (Sandbox Code Playgroud)

我理解当参数是集合 {1, 2, 3} 的大括号扩展三倍时printfwith 的%s作用(这将打印每个可能的结果)。

我知道这sort -u只会输出唯一的行。

我知道这sed /<pattern>/d用于删除任何匹配的行<pattern>

读了里面的模式sed,我有些糊涂了。我知道如何阅读,regex但我没有看到这种模式在sed命令中是如何工作的。

\( = literal '('
.  = any character, once
\) = literal ')'
.* = any character, zero or more times
\1 = reference to first captured group
Run Code Online (Sandbox Code Playgroud)

那么该sed命令如何从此regex模式中删除非唯一值?我不明白如何引用一个被捕获的组,而实际上没有一个?在模式中使用括号进行字面匹配?在 …

sed text-processing regular-expression

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

命令行变量赋值和命令执行

在研究有关 Bash 子 shell 的更深入信息时,我遇到了一个有趣的执行,我想了解它为何有效。执行涉及将字符串分配给变量,然后在man调用时使用该变量,链接到原始示例。我已经读过为什么LESS在该示例中使用特定变量(在许多发行版中man作为less默认分页器),我不明白的是命令执行后的变量赋值如何在没有任何类型的分隔元字符的情况下工作。

LESS=+/'OPTIONS' man manman直接在该部分下打开命令的手册页OPTIONS。它适用于直接使用less太打开的文件(这使我相信该LESS变量的使用less方式与在“会话”中进行正则表达式搜索相同less)。该LESS变量不会被导出,它永远不会保存在当前的 shell 环境中(执行不会echo $LESS返回任何内容),那么如何less捕获该值呢?

为什么这有效,但不是类似的东西foo='hello' echo $foo;仅当变量赋值和命令执行之间包含命令分隔符 ( ) 时,这种情况才有效。我什至尝试过foo=+'hello' echo $foo以防万一=+在 Bash 中做了一些我不知道的事情,但输出没有变化。

欢迎任何解释或阅读材料!

command-line less bash

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

Bash 重定向奇怪的行为

当我遇到一个有趣的结果时,我正在忙于捕获退出代码、重定向stdoutstderr案例声明,我希望有人能够阐明这一点。

我使用的是 bash 5.1.16。

该块可用于复制我所看到的行为:

#!/bin/sh -x

cleanup () {
    case $? in
        1) echo "message 1" ;;
        9) echo "message 2" ;;
    esac
}

trap cleanup EXIT

case 0 in
    0) exit 1 ;;
    2) echo "yay" ;;
esac > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

xtrace 输出> /dev/null 2>&1

+ trap cleanup EXIT
Run Code Online (Sandbox Code Playgroud)

xtrace 输出不带> /dev/null 2>&1

+ trap cleanup EXIT
+ case 0 in
+ exit 1
+ cleanup
+ case $? in …
Run Code Online (Sandbox Code Playgroud)

bash io-redirection trap

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