Я пытаюсь найти способ определить разницу между двумя строками в моем скрипте. Я мог бы легко сделать это с помощью diff или comm, но я не имею дело с файлами и предпочел бы не выводить их в файлы, сравнивать и читать обратно.
Я вижу, что comm, diff, cmp позволяют передавать либо два файла, либо файл и стандартный ввод - я думаю, это хорошо, если я не хочу выводить два файла ... но это все равно отстой.
Копался, думал, что могу использовать grep или регулярные выражения, но я думаю, что нет.
Ответы:
Используя
diff
илиcom
или что угодно:Часто задаваемые вопросы о Greg's Bash: подстановка процессов
или с именованным каналом
Greg's Bash FAQ: Работа с именованными каналами
Именованный канал также известен как FIFO.
Сам
-
по себе предназначен для стандартного ввода.<<<
"здесь строка".&
похоже,;
но помещает его на задний планисточник
FUNC(){ echo "$@"; "$@"; }; FUNC diff <(echo a) <(echo b);
$ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.")
\n
1c1
\n
< Here are the letters in String One.
\n
---
\n
> Here are the characters in String Two.
\n
использование канала аналогично, за исключением того, что он показывает номер процесса, начинается со1c1
следующего после следующего$
и ждет, пока вы не нажмете <kbd> Enter <kbd> (или вы можете выполнять другие команды ...)Напоминает мне вопрос: как можно различать два конвейера в Bash?
Если вы находитесь в сеансе bash, вы можете:
с
<
созданием анонимных именованных каналов - под управлением bash - поэтому они создаются и уничтожаются автоматически, в отличие от временных файлов.Итак, если вам удастся изолировать две разные строки как часть команды (grep, awk, sed, ...), вы можете сделать, например, что-то вроде:
(если вы предполагаете, что в вашем файле есть такие строки, как
string1=very_complicated_value
иstring2=another_long_and_complicated_value'
:, не зная внутреннего формата вашего файла, я не могу рекомендовать точную команду)источник
Я предпочитаю
cmp
функцию замены процесса в bash:Говоря о позиции 2, для первого встречается ab, а для второго - aq. В позиции 5 происходит еще одно отличие. Просто замените эти строки переменными, и все готово.
источник
Скажем, у вас три струны
Чтобы удалить префикс b из a
Чтобы удалить суффикс c из
источник
echo "$a" | sed "s!^$b!!g"
(я заменил стандартный разделитель sed / на! На случай, если обрабатываемые переменные являются путями. Кроме того, вы можете использовать здесь строку вместо echo:.sed ... <<< $a
)Другой пример:
Выходы
Оригинальный ответ здесь
источник