2

これがばかげているように聞こえたら申し訳ありませんが、この初心者を許してください。
これが私のコードです

line="abcd<>efgh->higk<-1234"
v1=$(echo ${line//<>/;})
echo $v1                   --> outputs "abcd;efgh->hijk<-1234"
v2=$(echo ${v1//->/})  
echo $v2                   --> output "abcd;efghhijk<-1234"
echo ${$v2//<-/}           --> output "abcd;efghhijk1234"

出力を中間変数に保存せずに、この出力を達成する方法を知っているかもしれません abcd; efghhijk1234

御時間ありがとうございます

4

2 に答える 2

3

sedとパイプを使用|して、置換コマンドを区切ることができます。

line="abcd<>efgh->highk<-1234"
v1=$(echo ${line} | sed 's|<>|;|g' | sed 's|->||g' | sed 's|<-||g')
echo $v1

上記は、要求されたを出力しabcd;efghhijk1234ます。

または、複数のコマンドを使用したくない場合は、それらすべてをオプションsedで組み合わせることができます。-e

v1=$(echo $line | sed -e 's/<>/;/g' -e 's/->\|<-//g');

注: sed-pattern内で使用される区切り文字を、2 番目のコマンドでa から|a に変更しました。/

于 2012-08-06T17:45:55.690 に答える
1

bash パラメーター展開を使用して 1 行ですべてを実行することはできませんが、bash の拡張パターン マッチングを利用して <- と -> の両方を同時に削除できます。

shopt -s extglob
line="abcd<>efgh->higk<-1234"
v1=${line//<>/;}
v2=${v1//@(->|<-)}

両方の項目が同じ置換テキスト (空の文字列) に置き換えられるため、いずれかのすべての出現を照合できます。

于 2012-08-06T17:57:53.140 に答える