使用awk捕获分隔的短语然后删除字符串

时间:2014-02-23 07:55:06

标签: bash sed awk

我有一个包含此内容的文件:

wewe-wev123-12343s
dsf-sdfs-1238674d
xcc-asdasd-234351g
dfd-sdfs-sdfssdf-2324g
dfgeg-dfgfg-dfsdf-2344G

我想要的输出是:

wewe-wev123-12343
dsf-sdfs-1238674
xcc-asdasd-234351
dfd-sdfs-sdfssdf-2324
dfgeg-dfgfg-dfsdf-2344

我想在结尾的最后一个分隔部分删除字符串。

我尝试的是:

awk -F- '{print $3}' input.txt

如何告诉它删除行尾数字后的字符串?

由于

5 个答案:

答案 0 :(得分:2)

如果您只是想从最后删除字符串,sed是一个很好的工具:

$ sed -r 's/[^0-9]+$//' input.txt
wewe-wev123-12343
dsf-sdfs-1238674
xcc-asdasd-234351
dfd-sdfs-sdfssdf-2324
dfgeg-dfgfg-dfsdf-2344

-r的{​​{1}}选项只是为了方便:它允许使用扩展的正则表达式语法,因此我们不需要这么多的反斜杠。正则表达式sed匹配行尾的任何非数字。替换[^0-9]+$删除行尾的所有非数字。

如果目标是在第三个字段中打印该号码,就像在问题的第一个版本中那样,那么:

s/[^0-9]+$//

另一种变化:如果按照@ BMW的评论,第三个字段没有数字,但我们仍然希望保留字段标记和输出中的前两个字段,该怎么办?在这种情况下,我们希望停止字段标记处的字母删除。要实现此行为,我们只需要在$ awk -F- '{sub("[a-z]+", "", $3); print $3}' input.txt 12343 1238674 234351 命令中添加单个字符:

sed

答案 1 :(得分:1)

怎么样:

$ cat file | cut -d- -f3 | grep -Eo '^[0-9]+'
12343
1238674
234351

我们使用cut,因为这比awk更简单。我们使用grep,因为这比sed简单。

  • cut命令与awk命令的作用相同。
  • grep -E表示扩展的正则表达式,-o表示只打印匹配的部分。我们在行的开头匹配1个或多个数字,因此忽略任何非数字(而不是打印)。

修改

您的新输出不同,我们现在只需要sed

$ sed -E 's/[a-zA-Z]+$//' file
wewe-wev123-12343
dsf-sdfs-1238674
xcc-asdasd-234351
dfd-sdfs-sdfssdf-2324
dfgeg-dfgfg-dfsdf-2344
  • -E用于扩展正则表达式
  • s/替换命令
  • [a-zA-Z]+一次或多次匹配这些字符
  • $将模式锚定到行尾
  • //无需替换

答案 2 :(得分:1)

你可以使用Bash。

while read line; do
    [[ $line =~ ([a-zA-Z])$ ]] && echo ${line%${BASH_REMATCH[1]}}
done < file

while read line; do
    [[ $line =~ (^[a-zA-Z|-]+[0-9]+) ]] && echo ${BASH_REMATCH[1]}
done < file

答案 3 :(得分:1)

awk都应该这样做:

awk '{sub(/[[:alpha:]]$/,"")}8' file

awk '{sub(/[^0-9]$/,"")}8' file

答案 4 :(得分:1)

使用gnu grep

grep -Po '.*(?=[^0-9]+$)' file