2017-10-12 89 views
2

我想删除括号内的所有内容<>,如果一行只有一行<>,但是如果行有多个,它似乎删除里面的所有内容外部<>。在一行中删除两个字符串之间的字符串

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

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

第一回声工作正常,但如果一个sentense有不止一个<>,它不能归类。

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

继awk将你有所帮助。

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' 

说明:通过该行的所有字段只是要(通过启动一个for循环,其开始从i=1耕种的NF(数字字段的值)),那么我检查一个字段的值是否满足正则表达式<.*>(意味着它),然后我将它取消。

1

*零次或多次与贪婪匹配。使用否定字符类<[^>]*>

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

它的工作原理,谢谢 –

相关问题