У меня была такая же проблема с моим HP. попробуйте загрузить новейший еженедельный выпуск Kali. http://cdimage.kali.org/kali-images/kali-weekly/ мне это помогло.
Вы можете использовать sed
для создания сценария sed
из file1, а затем запустить sed
с этим сценарием, чтобы превратить file2 в ожидаемый результат:
sed 's!^!s/!;s! = !/!;s!$!/!' file1 | sed -f- file2
first sed
выводит
s/This is a string/mystringrocks/
s/This is another string/mystringrocksmore/
, который явно выполняет необходимые вам замены.
Вы также можете использовать perl, он будет работать даже для строк, содержащих косые черты и восклицательные знаки:
perl -wE 'while (<>) {
chomp;
($from, $to) = split / = /;
$h{$from} = $to;
last if eof;
}
$regex = join "|", map quotemeta, keys %h;
s/($regex)/$h{$1}/, print while <>
' file1 file2
Он читает первый файл, разбивает каждую строку на =
и сохраняет пару $ из => $ до
в хэше. Затем он создает регулярное выражение из всех ключей (то есть из), перебирает второй файл и заменяет совпадения значениями, хранящимися в хэше. Также обычно ключи сортируют по длине, чтобы использовать более длинную строку, если есть два шаблона, которые начинаются в одном месте:
map quotemeta, sort { length $b <=> length $a } keys %h;
Если бы вы не выбрали разные разделители (: versus =) для двух файлов, было бы неплохо стандартная задача поиска с использованием ассоциативного массива в awk
Если у вас есть вариант GNU awk
, вы можете изменить разделители между файлами с помощью правила ENDFILE
, что позволит вам сделать
gawk 'BEGIN{FS=" = "} NR==FNR {a[$1]=$2;next} ENDFILE{FS=": "; OFS=FS;} {print $1, a[$2]}' file1 file2
Trying to figure out: mystringrocks
Still trying to figure it out: mystringrocksmore
Если вывод может быть смешанным (не сохранять исходный порядок строк), вы можете использовать join
join -o 2.1,1.2 -2 2 -t':' \
<(sed 's/^/ /;s/ =/:/' File1 |sort -t: -k1,1)\
<(sort -t: -k2 File2)