如何删除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
答案 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
尽管此解决方案不适用于嵌套或未对齐的括号。