Использование sed для вырезания и добавления к определенным строкам вывода различий

Как насчет одного USB-накопителя с несколькими LiveOS?

Вы можете разместить 32-битный дистрибутив и несколько 64-битных дистрибутивов на одном USB-накопителе с Мультизагрузкой , Мультисистемой(Веб-обзор на английском языке и другим обзором на английском языкеXBOOT .

Хотя это и не совсем то, что вы просили, это дает вам все на одном флэш-накопителе.

0
09.10.2020, 20:15
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

Пояснение

  • Я использовал !вместо /в качестве разделителя в sedрецепте s/match/replacement/, поскольку в противном случае нам пришлось бы экранировать каждое вхождение /в строках соответствия и замены
  • \1и \2в замещающих выражениях escape escape -в квадратных скобках (, т.е.\(...\))в части match

Большое предположение состоит в том, что у вас нет имен файлов, содержащих двоеточие и другие совпадающие слова из вывода 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
18.03.2021, 22:58

Теги

Похожие вопросы