使用 sed 剪切并添加到 diff 输出的特定行

使用 sed 剪切并添加到 diff 输出的特定行

我将两个目录之间的 diff 命令的输出存储在一个名为differenceOutput.txt.

目前只有两种线路differenceOutput.txt所以所有行都有格式 A 或 B,其中 A 和 B 如下所示:

A)

Only in /tmp/__tmp_comp206_alex/test_files/: file_1.txt

二)

Files /tmp/__tmp_comp206_alex/test_files/file_3.conf and /tmp/__tmp_comp206_alex/diff_dir/file_3.conf differ

使用sed,我想将differenceOutput.txt格式 A 的所有行更改为格式 C,将格式 B 的所有行更改为格式 D,其中 C 和 D 如下所示:

C)

/tmp/__tmp_comp206_alex/test_files/file_1.txt is missing

D)

/tmp/__tmp_comp206_alex/diff_dir/file_3.conf differs 

我怎样才能做到这一点sed?对 sed 语法超级困惑。我花了几个小时试图弄清楚这一点,但无法弄清楚这一点。有人可以帮我吗?

答案1

干得好。两个简单的sed替换

a='Only in /tmp/__tmp_comp206_alex/test_files/: file_1.txt'
b='Files /tmp/__tmp_comp206_alex/test_files/file_3.conf and /tmp/__tmp_comp206_alex/diff_dir/file_3.conf differ'

printf "%s\n%s\n" "$a" "$b" |
sed -e 's!^Only in \([^:]*\)/: \(.*\)!\1/\2 is missing!' -e 's!^Files .* and \(.*\) differ$!\1 differs!'

输出

/tmp/__tmp_comp206_alex/test_files/file_1.txt is missing
/tmp/__tmp_comp206_alex/diff_dir/file_3.conf differs

解释

  • 我在配方中使用了!not/作为分隔符,否则我们必须转义每一次出现的seds/match/replacement//匹配和替换字符串中的每一次出现
  • \1替换匹配中的 and转义\2括号表达式(即\(...\))在匹配部分

最大的假设是您的文件名不包含输出中的冒号和其他匹配单词diff。输出diff充其量是脆弱的,您最好滚动自己的循环并find直接cmp -s产生所需的输出。 (这是我对强大解决方案的偏好。)

#!/bin/bash
src='/tmp/__tmp_comp206_alex/test_files'
dst='/tmp/__tmp_comp206_alex/diff_dir'

( cd "$src" && find -type f -print0 ) |
    while IFS= read -r -d '' item
    do
        if [[ ! -f "$dst/$item" ]]
        then
            printf "%s is missing\n" "$dst/$item"

        elif ! cmp -s "$src/$item" "$dst/$item"
        then
            printf "%s differs\n" "$dst/$item"
        fi
    done

答案2

$ awk '
    sub(/^Only in /,"") { sub(/: /,""); $0=$0 " is missing" }
    sub(/^Files /,"")   { sub(/ and .*/,""); $0=$0 " differs" }
1' differenceOutput.txt
/tmp/__tmp_comp206_alex/test_files/file_1.txt is missing
/tmp/__tmp_comp206_alex/test_files/file_3.conf differs

假设您的目录名称不包含:<blank><blank> and <blank>并且您的文件/目录名称都不包含换行符。

使用根据您在问题中提供的示例输入创建的文件对上述内容进行了测试:

$ cat differenceOutput.txt
Only in /tmp/__tmp_comp206_alex/test_files/: file_1.txt
Files /tmp/__tmp_comp206_alex/test_files/file_3.conf and /tmp/__tmp_comp206_alex/diff_dir/file_3.conf differ

相关内容