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:如何消除字符串中的所有数字字符,但保留括号内的字符?的主要内容,如果未能解决你的问题,请参考以下文章

Bash Shell中的通配符及转义字符的使用

如何禁用bash中的特殊字符? [复制]

js 数字 与 字符串之间的操作

如何替换字符串中的特殊字符?

Python移除指定文件夹中所有文件名称中的特殊字符(数字特殊字符空格等)只保留字母字符

Python移除指定文件夹中所有文件名称中的特殊字符(数字特殊字符空格等)只保留字母字符