スクリプト内の2つの文字列の違いを判別する方法を見つけようとしています。これはdiffやcommで簡単に実行できますが、ファイルを扱っていないため、ファイルに出力したり、比較したり、読み直したりしたくありません。
comm、diff、cmpはすべて、2つのファイルまたはファイルと標準入力のいずれかを渡すことができることがわかります。2つのファイルを出力したくない場合は、これで十分でしょう。
私はgrepまたは正規表現を使用できると考えて掘り下げていましたが、私はそうは思いません。
スクリプト内の2つの文字列の違いを判別する方法を見つけようとしています。これはdiffやcommで簡単に実行できますが、ファイルを扱っていないため、ファイルに出力したり、比較したり、読み直したりしたくありません。
comm、diff、cmpはすべて、2つのファイルまたはファイルと標準入力のいずれかを渡すことができることがわかります。2つのファイルを出力したくない場合は、これで十分でしょう。
私はgrepまたは正規表現を使用できると考えて掘り下げていましたが、私はそうは思いません。
回答:
使用するdiff
か、com
またはあなたが好き:
diff <(echo "$string1" ) <(echo "$string2")
Greg's Bash FAQ:Process Substitution
または名前付きパイプで
mkfifo ./p
diff - p <<< "$string1" & echo "$string2" > p
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で2つのパイプラインをどのように比較できますか?
あなたがbashセッションにいるなら、あなたは次のことをすることができます:
diff <cmd1 <cmd2
diff <(foo | bar) <(baz | quux)
<
bashで管理される- -彼らは作成され、一時ファイルとは異なり、自動的に破棄されるように、匿名の名前付きパイプを作成します。
したがって、2つの異なる文字列をコマンドの一部として分離できた場合(grep、awk、sedなど)、次のようなことができます。
diff < grep string1 myFile < grep string2 myFile
(あなたが思うならば、あなたは次のようにあなたのファイルの行を持っているstring1=very_complicated_value
とstring2=another_long_and_complicated_value'
:あなたのファイルの内部フォーマットを知らなくても、私は正確なコマンドをお勧めすることはできません)
私cmp
はbashのProcess Substitution機能を好みます:
$ cmp -bl <(echo -n abcda) <(echo -n aqcde)
2 142 b 161 q
5 141 a 145 e
位置2について言うと、最初はabが発生し、2番目はaqが発生します。ポジション5では、別の違いが生じています。これらの文字列を変数に置き換えるだけで、完了です。
3つの弦があるとします
a="this is a line"
b="this is"
c="a line"
aからプレフィックスbを削除するには
echo ${a#"$b"} # a line
aからサフィックスcを削除するには
echo ${a%"$c"} # this is
echo "$a" | sed "s!^$b!!g"
(処理する変数がパスの場合は、標準のsedセパレーター/ for!を取り替えました。また、echo:の代わりにhere文字列を使用できますsed ... <<< $a
。)