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

时间:2018-09-13 09:34:54

标签: bash shell unix awk

如何删除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

5 个答案:

答案 0 :(得分:1)

使用sed可能会更容易:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

请您尝试以下。

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

答案 3 :(得分:0)

这可能对您有用(GNU sed);

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

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

答案 4 :(得分: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

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