Bash 中的字符串差异

我试图找到一种方法来确定我的脚本中两个字符串之间的区别。我可以使用 diff 或 comm 轻松地完成这项工作,但是我不处理文件,我不希望将它们输出到文件中,进行比较并读回来。

我看到 comm,diff,cmp 都允许传递两个文件或者一个文件和标准输入-我想如果我不想输出两个文件,这是好的... 但它仍然有点糟糕。

我一直在想我可以使用 grep 或正则表达式,但我想不行。

111590 次浏览

让我想起了这个问题: 如何区分 Bash 中的两个管道?

如果您在 bash 会话中,可以执行以下操作:

diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)

通过 <创建匿名命名管道——由 bash 管理——所以它们是自动创建和销毁的,这与临时文件不同。

因此,如果您设法将两个不同的字符串作为命令(grep、 awk、 sed、 ...)的一部分隔离开来,那么您可以这样做(例如) :

diff < grep string1 myFile < grep string2 myFile

(如果您假设您的文件行中包含 string1=very_complicated_valuestring2=another_long_and_complicated_value': 在不知道文件内部格式的情况下,我无法推荐一个精确的命令)

使用 diffcom或任何你想要的:

diff  <(echo "$string1" ) <(echo "$string2")

格雷格的狂欢常见问题解答: 程序替代

或者用一根有名字的管子

mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p

格雷格的狂欢常见问题解答: 使用命名管道

命名管道也称为 FIFO。

-本身是用于标准输入的。

<<<是“ here string”。

&;很像,但是把它放在后台

我更喜欢 bash 的 cmp和进程替换特性:

$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
2 142 b    161 q
5 141 a    145 e

说到位置2,a b 出现在第一个位置,而 q 出现在第二个位置。在位置5,另一个不同正在发生。只要用变量替换这些字符串,就可以了。

假设你有三根弦

a="this is a line"
b="this is"
c="a line"

从。中移除前缀 b

echo ${a#"$b"}  # a line

将后缀 c 从

echo ${a%"$c"}  # this is

另一个例子:

before="184613 102050 83756 63054"
after="184613 102050 84192 83756 63054"


comm -23 <(tr ' ' $'\n' <<< $after | sort) <(tr ' ' $'\n' <<< $before | sort)

输出

84192

原始答案在这里