2017-10-12 15 views
2

括弧の中のすべてを削除しようとしていますが、1行に1つしかない場合には<がありますが、行に複数の文字が含まれていると、外側は<>です。1行に2つの文字列の間に文字列を削除する

echo "hi, <how> are you" | sed 's/<.*>//' 
result: hi, are you 

echo "hi, <how> are <you>? " | sed 's/<.*>//' 
result: hi, ? 

最初のエコーが正常に動作しているが、1 sentense>が複数の<を持っている場合、それは分類することができません。 awkの後

expected input: 1 <a> 2 <b> 3 <c> 4 <d> ...... 1000 <n> 
expected out come: 1 2 3 4 .... 1000 

おかげで

+0

'' <.*>それは、それが動作 '<.*?>'や '<[^>] *>' – mkHun

答えて

2
awkを使用して

# using gsub - recommended 
$ echo "1 <a> 2 <b> 3 <c> 4 <d> ...... 1000 <n>" | awk 'gsub(/<[^>]*>/,"")' 
1 2 3 4 ...... 1000 

# OR using FS and OFS 
$ echo "1 <a> 2 <b> 3 <c> 4 <d> ...... 1000 <n>" | awk -F'<[^>]*>' -v OFS='' '$1=$1' 
1 2 3 4 ...... 1000 
+1

する必要がありますにそれが動作感謝を –

1

あなたに参考になります。

echo "hi, <how> are <you>? " | awk '{for(i=1;i<=NF;i++){if($i~/<.*>/){$i=""}}} 1' 

OR

echo "1 <a> 2 <b> 3 <c> 4 <d> ...... 1000 <n>" | awk '{for(i=1;i<=NF;i++){if($i~/<.*>/){$i=""}}} 1' 

説明:は、単にフィールドのNFの値までにi=1から始まるforループ(番号を開始することにより(行のすべてのフィールドを通過))、フィールドの値が正規表現<.*>(それが意味する)を満たしていれば、それを無効にしているかどうかを調べています。

1

*は貪欲に0回以上一致します。 <[^>]*>

echo "hi, <how> are <you>? " | sed 's/<[^>]*>//g' 
+0

否定文字クラスを使用して、おかげで –

関連する問題