第二列中允许使用的字符为0到9,A到Z以及“ +”和“-”之类的符号,如果在第二列中找到允许的字符,则完整记录应为Transfer,否则应为null 输入
- 1|89+
- 2|-AB
- 3|XY*
- 4|PR%
输出
- 1|89+
- 2|-AB
- 3|<null>
- 4|<null>
grep -E '^[a-zA-Z0-9\+\-\|]+$' file > file1
但是上面的代码是如果找不到匹配项则丢弃完整记录,我需要所有记录,但是如果找到匹配项,则应该Transfer,否则为null Transfer。
答案 0 :(得分:0)
使用sed
替换管道之后的所有内容,该管道以数字,字母,正负号类中的零个或多个字符开头,后跟一个不在该类中的字符,直到字符串结尾为止。只是一个管道。
sed 's/\|[0-9a-zA-Z+-]*[^0-9a-zA-Z+-].*$/|/' file
答案 1 :(得分:0)
在受支持的地方使用awk和字符类:
$ awk 'BEGIN{FS=OFS="|"}$2~/[^[:alnum:]+-]/{$2=""}1' file
1|89+
2|-AB
3|
4|
在不受支持的地方(例如mawk)使用:
$ awk 'BEGIN{FS=OFS="|"}$2~/[^A-Za-z0-9+-]/{$2=""}1' file