Bash:如何消除字符串中的所有数字字符,但保留括号内的字符?

问题描述 投票:1回答:5

如何删除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
bash shell unix awk
5个回答
1
投票

使用sed可能更容易:

sed -E 's/(^| )[0-9]+( |$)/ /g' file

(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas

1
投票

根据您提供的示例输入/输出,您似乎在询问如何为您的问题实现一种可能的解决方案,而不是询问您的问题,即这似乎是一个XY question。这可能是你真正需要的:

$ awk '{t=$1; gsub(/[0-9]/,""); $1=t} 1' file
(A678) John, Apples and Oranges
(E312) Mark, Oranges
(B21) Brooke, Bananas

0
投票

你可以尝试一下吗?

awk '{for(i=1;i<=NF;i++){if($i!~/\(|\)/ && $i~/[0-9]/){sub(/[0-9]+/,"",$i)}}} 1' Input_file

0
投票

这可能适合你(GNU sed);

sed 's/\(\([^(0-9]*\(([^)]*)\)[^(0-9]*\)*\)[0-9]\+ */\1/g' file

在一个或多个数字字符后跟零或多个空格之前,收集要保留的所有可能字符,并将其替换为第一个集合。在整个文件中全局执行此操作。


0
投票

使用GNU awk:

awk -v RS='[ \n]' '!/^[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="[()\n]" 'RT!=")"{gsub(/[0-9]+ ?/,"")}!/^[0-9]+$/{printf "%s%s",$0,RT}' file

此解决方案虽然不适用于嵌套或未对齐的括号。

© www.soinside.com 2019 - 2024. All rights reserved.