同じ入力行に表示できない場合はStringB、StringAsedに一方向の置換を実行し、最初に検索された文字列が発生しなかった場合にのみ他の方法を試すように指示できます。
<file.txt sed -e 's/StringA/StringB/g' -e t -e 's/StringB/StringA/g'
一般的な場合、sedには簡単な方法はないと思います。ちなみに、ノートでは仕様があれば曖昧であることStringAとStringB重複することができます。これは、どちらかの文字列の左端の出現を置き換えて繰り返すPerlソリューションです。
<file.txt perl -pe 'BEGIN {%r = ("StringA" => "StringB", "StringB" => "StringA")}
s/(StringA|StringB)/$r{$1}/ge'
POSIXツールを使い続けたい場合は、awkが最適です。Awkには一般的なパラメータ化された置換のためのプリミティブがないため、独自にロールする必要があります。
<file.txt awk '{
while (match($0, /StringA|StringB/)) {
printf "%s", substr($0, 1, RSTART-1);
$0 = substr($0, RSTART);
printf "%s", /^StringA/ ? "StringB" : "StringA";
$0 = substr($0, 1+RLENGTH)
}
print
}'
sed: can't read s/StringB/StringA/g: No such file or directory。そうです-e t PATTERN、よく理解されていません。