使用sed消除所有与所需表单不匹配的行

使用sed消除所有与所需表单不匹配的行,sed,Sed,我有一个单列csv,看起来像这样: KFIG KUNV K~LK K7RT 3VGT 有些数据点在传输过程中被弄乱了。我只需要保留以大写字母开头的条目,然后其他三位数字可以是大写字母或数字。例如,在上面的列表中,我必须删除K~LK和3VGT 我知道要删除除大写字母以外的所有字母,我都能写 sed -n '/[A-Z]\{4,\}/p' 我只是想调整一下,最后三位数字可以是大写字母或数字。任何帮助都将不胜感激。只需使用: sed -n '/[A-Z][A-Z0-9]\{3,\}/p' 但是,

我有一个单列csv,看起来像这样:

KFIG
KUNV
K~LK
K7RT
3VGT
有些数据点在传输过程中被弄乱了。我只需要保留以大写字母开头的条目,然后其他三位数字可以是大写字母或数字。例如,在上面的列表中,我必须删除
K~LK
3VGT

我知道要删除除大写字母以外的所有字母,我都能写

sed -n '/[A-Z]\{4,\}/p'
我只是想调整一下,最后三位数字可以是大写字母或数字。任何帮助都将不胜感激。

只需使用:

sed -n '/[A-Z][A-Z0-9]\{3,\}/p'
但是,如果这些标识符确实是文件中的所有标识符,我将提出以下命令(它将确保整行匹配,因此它将拒绝长度超过4个字符的标识符):

  • ^
    表示“在行首匹配零长度字符串”
  • \{3\}
    表示“精确匹配前一个原子的3次出现”,前一个原子为
    [A-Z0-9]
  • $
    表示“在行尾匹配零长度字符串”

是否有理由选择一种方式而不是另一种方式?在您的情况下,是的-最好编写一个与整行匹配的表达式。例如,如果输入中存在,第一个表达式将导致sed打印
3FOOB
,因为
FOOB
匹配。第二个表达式通过尝试匹配整行来防止出现这种情况。但是,如果您完全确定输入文件中的标识符包含的字符数不超过四个,那么您也可以安全地使用第一个表达式(或者可能是一个变体:
[a-Z][a-Z0-9]\{3\}
)。
sed -n '/^[A-Z][A-Z0-9]\{3\}$/p'