Bash字符串差异


70

我试图找到一种方法来确定我的脚本中两个字符串之间的差异。我可以很容易地用diff或comm来做到这一点,但我并没有处理文件,我不希望将它们输出到文件,进行比较并将其读回来。

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

一直在思考我可以使用grep或正则表达式 - 但我猜不是。

由于提前,

+1

什么是你真正想要做删除后缀C吗? 18 1月. 092009-01-18 02:51:04

  0

您可以使用子字符串操作和内置测试操作与IFS更改进行比较,但是您需要知道是否要逐字,逐字逐行比较字符,忽略空白字符... 21 7月. 122012-07-21 10:33:51

  0

请参见https:/ /stackoverflow.com/questions/34376884/highlight-string-differences 10 3月. 182018-03-10 17:20:29

9

让我想起了这样一个问题:How can you diff two pipelines in 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':不知道你的文件的内部格式,我不能推荐一个精确的命令)


124

使用任何你想要的diffcom或:

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

格雷格的Bash的常见问题解答:Process Substitution

或命名管道

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

格雷格的Bash的常见问题解答:Working with Named Pipes

命名管道也称为FIFO。

-本身就是标准输入。

<<<是“这里的字符串”。

&就像;但把它在后台

+3

+1以获得正确答案。 +1对符号的很好解释。此外,Greg的Bash FAQ已移至:http://mywiki.wooledge.org/上述页面的链接现在位于http://mywiki.wooledge.org/ProcessSubstitution和http://mywiki.wooledge.org/ BashFAQ/085 20 2月. 132013-02-20 17:30:24

  0

thx!并且,这将显示动态文件描述符'FUNC(){echo“$ @”; “$ @”; }; FUNC diff <(echo a)<(echo b);' 16 4月. 152015-04-16 01:30:54

  0

我正在寻找比较两个shasums的。不知道是否有更优雅的方式来做到这一点,但它的工作原理。 23 8月. 162016-08-23 08:29:09

  0

如果$ string1和$ string2中有多行,并且diff输出已添加或减少的行,则这似乎可行。如果字符串是单行,并且行和两个字符串之间有一些区别呢? 10 8月. 172017-08-10 15:28:00


11

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

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

话说上位置2,AB发生的第一,但水溶液为第二。在位置5处,另一个区别正在发生。只需用变量替换这些字符串,就完成了。

  0

只有当字符串长度相同时,这才起作用! 06 5月. 162016-05-06 11:58:04


8

说你有三根弦

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

要从

echo ${a#"$b"} 

删除前缀B向来自一个

echo ${a%"$c"} 
+1

我想这是这样做的bash方式。它很好地工作。这个语法虽然有点难以理解。 05 11月. 142014-11-05 20:39:25

  0

@MikaelRoos同意。更容易阅读(对我来说)将使用sed:'echo“$ a”| sed“s!^ $ b !! g”'(换出标准sed分隔符/ for!以防被处理的变量为路径。此外,您可以使用这里的字符串而不是echo:'sed ... <<< $ a'。) 08 9月. 162016-09-08 18:06:40