我将两个目录之间的 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/
作为分隔符,否则我们必须转义每一次出现的sed
s/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