我试图找到一种方法来确定我的脚本中两个字符串之间的区别。我可以使用 diff 或 comm 轻松地完成这项工作,但是我不处理文件,我不希望将它们输出到文件中,进行比较并读回来。
我看到 comm,diff,cmp 都允许传递两个文件或者一个文件和标准输入-我想如果我不想输出两个文件,这是好的... 但它仍然有点糟糕。
我一直在想我可以使用 grep 或正则表达式,但我想不行。
让我想起了这个问题: 如何区分 Bash 中的两个管道?
如果您在 bash 会话中,可以执行以下操作:
diff <cmd1 <cmd2 diff <(foo | bar) <(baz | quux)
通过 <创建匿名命名管道——由 bash 管理——所以它们是自动创建和销毁的,这与临时文件不同。
<
因此,如果您设法将两个不同的字符串作为命令(grep、 awk、 sed、 ...)的一部分隔离开来,那么您可以这样做(例如) :
diff < grep string1 myFile < grep string2 myFile
(如果您假设您的文件行中包含 string1=very_complicated_value和 string2=another_long_and_complicated_value': 在不知道文件内部格式的情况下,我无法推荐一个精确的命令)
string1=very_complicated_value
string2=another_long_and_complicated_value'
使用 diff或 com或任何你想要的:
diff
com
diff <(echo "$string1" ) <(echo "$string2")
格雷格的狂欢常见问题解答: 程序替代
或者用一根有名字的管子
mkfifo ./p diff - p <<< "$string1" & echo "$string2" > p
格雷格的狂欢常见问题解答: 使用命名管道
命名管道也称为 FIFO。
-本身是用于标准输入的。
-
<<<是“ here string”。
<<<
&和 ;很像,但是把它放在后台
&
;
我更喜欢 bash 的 cmp和进程替换特性:
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
原始答案在这里