满足条件时删除字符串
Remove a string when a condition is met
我有一个制表符分隔的文本,文本中有一个多次出现的字符串,当它与其他字符串一起出现时我需要将其删除。
A B C D E F G H I J
string string string car29 "" "" "" "" "" string # We don't do anything
string string string pool car29 "" "" "" "" string # Remove car29
string string string fifo pool car29 "" "" "" string # Remove car29
string string string car29 "" "" "" "" "" string # We don't do anything
关键词是car29,我们只对出现这个词的行进行操作
预期输出
A B C D E F G H I J
string string string car29 "" "" "" "" "" string
string string string pool "" "" "" "" "" string
string string string fifo pool "" "" "" "" string
string string string car29 "" "" "" "" "" string
Perl 来拯救!
perl -F'/\t/' -ape 's/(^|(?<=\t))car29($|(?=\t))/""/g if grep $_ ne "car29" && $_ ne q(""), @F[3..8]'
-F
设置列分隔符
-a
拆分为列(进入 @F
数组)
-p
逐行处理输入,打印结果
- 仅当第 3 .. 8 列(只是猜测,您的说明含糊不清)不为空且与
car29
不同时才会发生替换
- 当它前面是行首或制表符,后面是行尾或制表符时,
car29
替换为 ""
。环顾四周断言用于有多个 car29
相邻的情况。 ^
和 $
可能不需要,因为示例中的前三列和最后一列从不包含 car29
(又是不完整的规范)。
和sed
sed '/\(.*"".*\)\{5\}/! s/car29/""/' <<\eof
A B C D E F G H I J
string string string car29 "" "" "" "" "" string # We don't do anything
string string string pool car29 "" "" "" "" string # Remove car29
string string string fifo pool car29 "" "" "" string # Remove car29
string string string car29 "" "" "" "" "" string # We don't do anything
eof
A B C D E F G H I J
string string string car29 "" "" "" "" "" string # We don't do anything
string string string pool "" "" "" "" "" string # Remove car29
string string string fifo pool "" "" "" "" string # Remove car29
string string string car29 "" "" "" "" "" string # We don't do anything
我有一个制表符分隔的文本,文本中有一个多次出现的字符串,当它与其他字符串一起出现时我需要将其删除。
A B C D E F G H I J
string string string car29 "" "" "" "" "" string # We don't do anything
string string string pool car29 "" "" "" "" string # Remove car29
string string string fifo pool car29 "" "" "" string # Remove car29
string string string car29 "" "" "" "" "" string # We don't do anything
关键词是car29,我们只对出现这个词的行进行操作
预期输出
A B C D E F G H I J
string string string car29 "" "" "" "" "" string
string string string pool "" "" "" "" "" string
string string string fifo pool "" "" "" "" string
string string string car29 "" "" "" "" "" string
Perl 来拯救!
perl -F'/\t/' -ape 's/(^|(?<=\t))car29($|(?=\t))/""/g if grep $_ ne "car29" && $_ ne q(""), @F[3..8]'
-F
设置列分隔符-a
拆分为列(进入@F
数组)-p
逐行处理输入,打印结果- 仅当第 3 .. 8 列(只是猜测,您的说明含糊不清)不为空且与
car29
不同时才会发生替换
- 当它前面是行首或制表符,后面是行尾或制表符时,
car29
替换为""
。环顾四周断言用于有多个car29
相邻的情况。^
和$
可能不需要,因为示例中的前三列和最后一列从不包含car29
(又是不完整的规范)。
和sed
sed '/\(.*"".*\)\{5\}/! s/car29/""/' <<\eof
A B C D E F G H I J
string string string car29 "" "" "" "" "" string # We don't do anything
string string string pool car29 "" "" "" "" string # Remove car29
string string string fifo pool car29 "" "" "" string # Remove car29
string string string car29 "" "" "" "" "" string # We don't do anything
eof
A B C D E F G H I J
string string string car29 "" "" "" "" "" string # We don't do anything
string string string pool "" "" "" "" "" string # Remove car29
string string string fifo pool "" "" "" "" string # Remove car29
string string string car29 "" "" "" "" "" string # We don't do anything