我有一个包含此内容的文件:
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
如何告诉它删除行尾数字后的字符串?
由于
答案 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