如何根据模式匹配将一行从一个文件移动到另一个文件?

如何根据模式匹配将一行从一个文件移动到另一个文件?

我想将文本文件中的行移动到另一个文本文件中。这些行包含一个以下划线开头的单词。这个词位于第六线的场;字段用正斜杠分隔。例如,移动_Nokia下面示例输入文件中包含第六个字段的行。

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

我尝试使用正则表达式移动相应的行grep,但它不起作用。

$ grep -F 'Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/' match.txt >file1.txt
$ grep -F -v "Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/" match.txt \
    > match.txt.tmp && mv match.txt.tmp match

预期产出

$ cat file1.txt
Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
$ cat match
Apple/One-plus/Samsung/Mi/HTC/OPPO/

如何根据模式匹配将一行从一个文件移动到另一个文件?

答案1

原版

-F不能使用有关 的选项来指定正则表达式grep。还有一个关于正则表达式的问题。如果该字符^用作锚点来匹配行的开头,那么它必须是正则表达式的第一个字符。

prompt% cp -v input input.back
prompt% grep -e "$regex" input.back > output
prompt% grep -v "$regex" input.back > input

正则表达式:原发者没有提供具体的输入,因此很难找到合适的正则表达式。

编辑:最后,原始发布者提供了一个示例输入文件。

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

正则表达式: regex

regex='\([-[:alpha:]]\+\/\)\{5\}_Nokia\/'

替代解决方案

对于从未阅读过 sed 手册的初学者,不建议使用这些类似的解决方案。

sed -n "/$regex/p;/$regex/d;w input" input.back > output

粗略地说,将与正则表达式匹配的行保存在文件中output,然后将它们从相应的 sed 缓冲区中删除,并将缓冲区内容写入文件中input

sed -i.back -e "/$regex/w output" -e "/$regex/d" input

这些命令有细微的差别,但第二个更方便。

答案2

如果你有合适的最新版本的 GNU awk ( gawk) 你可以这样做

awk -i inplace -F'/' '$7 == "_f" {print > "otherfile"; next} 1' file

如果您的 awk 不支持该-i inplace选项,那么您可以执行相同的操作,但将输出重定向到临时文件,然后重命名它。

答案3

这个提议怎么样?这是一个不太简洁的命题@steeldriver 的回答尽管如此,它是一个渐进的解决方案(一步一步)。

$ cut -d/ -f7 data.txt  | grep -n _f | cut -d: -f 1 | xargs -i sed -n {}p data.txt > otherfile.txt
  • _f是与其他文件创建匹配时的模式。

  • data.txt是你的文件

  • /是你的分隔符

如果这有效,则执行 acomm计算出原始文件中应保留的内容。

$ comm -23 data.txt otherfile.txt > remainder.txt

剩余.txt是您的data.txt,删除了位。

答案4

您可以首先通过以下方式将预期的行移动到另一个文件 (outemp.txt):

sed -n  '/_/w outemp.txt' input_file

然后通过以下方式从您的 input_file 中删除这些行:

sed  -i '/_/d' input_file

检查结果:

cat outemp.txt 
Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/

cat input_file
Apple/One-plus/Samsung/Mi/HTC/OPPO/

相关内容