如何删除第一个字段仅包含特殊字符的行?

如何删除第一个字段仅包含特殊字符的行?

如何删除仅在第一个分隔字段中包含/or'-or的行?.|

  • 尝试过的代码:
    sed 's/^\.\d; /^\-/d; /^\//d' file > file_out
    
  • 输入示例:
    /|98374|
    /trust|q83129|
    //|392720|
    //cust|23892|
    .|9374|
    .abcd|28374|
    '|238674|
    'hcsu|3810|
    -|327492|
    -abcde|9837|
    
  • 预期输出:
    .abcd|28374|
    /trust|q83129|
    //cust|23892|
    'hcsu|3810|
    -abcde|9837|
    

答案1

基于“强制”awk的解决方案:)

awk -F'|' '$1 !~ /^[\/'\''.-]+$/' input.txt

这会将字段分隔符设置为|并且仅在满足条件时才打印“第一个字段 ( ) 与正则表达式 ( ) '仅包含, ,或' ( ,经过适当转义)$1不匹配”!~/'.-^[/'.-]+$已实现。

请注意,表达这一点的语法有点复杂,因为程序awk需要用单引号 ( ' ... ') 括起来,否则 shell 会像$1在到达 之前那样解释语句awk。因此,字符列表包含单引号的“中断”(第一个'),然后是转义文字单引号 ( \'),然后是单引号程序的延续awk

或者,也许更容易阅读,将程序编写为一个带引号的字符串、一个带引号的字符串和另一个带引号的字符串的awk串联:'...'"..."'...'

awk -F'|' '$1 !~ /^'"[\/'.-]"'+$/' input.txt

答案2

如果您的意思是删除第一个|分隔字段完全由集合中的字符组成的行.-/',则:

grep -vxE "[./'-]+(\|.*)?"

(完全删除(带有-v)行 ( ),该行由集合中 1 个或多个 ( ) 字符-x的序列组成,后跟可选的 ( ),后跟任意数量 ( ) 的字符 ( ))。+./'-?|*.

或者

grep -vE "^[./'-]+(\||\$)"

(删除^以 ( ) 开头且集合中包含 1 个或多个 ( +) 字符的行./'-,后跟 ( |)|或行尾 ($转义,因为它对于双引号内的 shell 来说仍然是特殊的,但通常不会在后跟)))。

如果您还想删除第一个字段为空的行,请替换+为。*或者使用:

grep "^[^|]*[^|./'-]"

搜索除第一个字符^之外至少包含一个 ()以外的字符的行。./'-|

更一般地说,请注意sed /regexp/d可以写成grep -v regexp(和sed '/re1/d; /re2/d'-> grep -v -e re1 -e re2)。grep除了更小并且通常更快之外,sed还具有可移植地支持扩展正则表达式的优点,但并非所有sed实现都支持-E。支持正则表达式的grep实现也多于支持正则表达式的实现。-Pperlsed

答案3

你期望s/^\.\d做什么?你打开了一个s替代命令,但后来你只是被其他一些斜杠意外地关闭了它。您可能想/^\./d删除带有点的行,但这也会删除该.abcd行。

./'-但您实际上似乎想要删除除之前没有其他字符的行|。因此,将其放入正则表达式中:

sed "/^[./'-]*|/d" < file > file_out

这不会对打印行进行重新排序(如您所需的输出),但您没有指定如何对其进行重新排序。

并且您的示例没有显示如何处理空的第一个字段。如果应该打印此内容,请使用

sed "/^[./'-]\{1,\}|/d" < file > file_out

答案4

awk -F '|' "\$1 ~ /[^-./']|^$/" file

相关内容