我正试图找到一种方法来确定我脚本中两个字符串之间的区别.我可以通过diff或comm轻松地做到这一点,但我不处理文件,我不想将它们输出到文件,进行比较并将其读回.
我看到comm,diff,cmp都允许传递两个文件或文件和标准输入 - 我想如果我不想输出两个文件那就好......但它仍然有点糟糕.
一直在思考我可以使用grep或正则表达式 - 但我猜不是.
Ian*_*ing 177
使用diff或com或任何你想要的:
diff <(echo "$string1" ) <(echo "$string2")
Run Code Online (Sandbox Code Playgroud)
Greg的Bash FAQ:流程替换
或者使用命名管道
mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p
Run Code Online (Sandbox Code Playgroud)
Greg的Bash FAQ:使用命名管道
命名管道也称为FIFO.
在-自身为标准输入.
<<< 是一个"这里的字符串".
&就像是;把它放在后台
Von*_*onC 16
让我想起这个问题:如何在Bash中区分两个管道?
如果你正在进行bash会话,你可以做一个:
diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)
Run Code Online (Sandbox Code Playgroud)
与<创建匿名命名管道-由bash的管理-让他们创建并自动销毁,不像临时文件.
因此,如果你设法将两个不同的字符串作为命令的一部分(grep,awk,sed,...)隔离,你可以做 - 例如 - 类似于:
diff < grep string1 myFile < grep string2 myFile
Run Code Online (Sandbox Code Playgroud)
(如果你认为你的文件行中有string1=very_complicated_value和a string2=another_long_and_complicated_value':不知道文件的内部格式,我不能推荐一个精确的命令)
Joh*_*itb 13
我更喜欢cmp和bash的处理替换功能:
$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
2 142 b 161 q
5 141 a 145 e
Run Code Online (Sandbox Code Playgroud)
在位置2上说,ab表示第一个,而aq表示第二个.在第5位,另一个差异正在发生.只需用变量替换这些字符串,就完成了.
Pit*_*kos 11
假设你有三个字符串
a="this is a line"
b="this is"
c="a line"
Run Code Online (Sandbox Code Playgroud)
从a中删除前缀b
echo ${a#"$b"} # a line
Run Code Online (Sandbox Code Playgroud)
从a中删除后缀c
echo ${a%"$c"} # this is
Run Code Online (Sandbox Code Playgroud)