Bash:如何消除字符串中的所有数字字符,但保留括号内的字符?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash:如何消除字符串中的所有数字字符,但保留括号内的字符?相关的知识,希望对你有一定的参考价值。
如何删除bash中字符串中的所有数字,但使用awk将这些数字保留在括号内?
存储在.txt文件中的示例数据:
(A678) John, 35 Apples and 9 Oranges
(E312) Mark, 12 Oranges
(B21) Brooke, 40 Bananas
输出:
(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas
答案
使用sed
可能更容易:
sed -E 's/(^| )[0-9]+( |$)/ /g' file
(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas
另一答案
根据您提供的示例输入/输出,您似乎在询问如何为您的问题实现一种可能的解决方案,而不是询问您的问题,即这似乎是一个XY question。这可能是你真正需要的:
$ awk '{t=$1; gsub(/[0-9]/,""); $1=t} 1' file
(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas
另一答案
你可以尝试一下吗?
awk '{for(i=1;i<=NF;i++){if($i!~/(|)/ && $i~/[0-9]/){sub(/[0-9]+/,"",$i)}}} 1' Input_file
另一答案
这可能适合你(GNU sed);
sed 's/(([^(0-9]*(([^)]*))[^(0-9]*)*)[0-9]+ */1/g' file
在一个或多个数字字符后跟零或多个空格之前,收集要保留的所有可能字符,并将其替换为第一个集合。在整个文件中全局执行此操作。
另一答案
使用GNU awk:
awk -v RS='[
]' '!/^[0-9]+$/{printf "%s%s",$0,RT}' file
(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas
如果记录(使用RS
设置)不是数字!/^[0-9]+$/
,awk会打印它。
正如@kvantour的评论中所强调的那样,这仅适用于括号内的数字不是空格的情况。如果是这样,您可以使用以下内容:
awk -v RS="[()
]" 'RT!=")"{gsub(/[0-9]+ ?/,"")}!/^[0-9]+$/{printf "%s%s",$0,RT}' file
此解决方案虽然不适用于嵌套或未对齐的括号。
以上是关于Bash:如何消除字符串中的所有数字字符,但保留括号内的字符?的主要内容,如果未能解决你的问题,请参考以下文章