我想将文本文件中的行移动到另一个文本文件中。这些行包含一个以下划线开头的单词。这个词位于第六线的场;字段用正斜杠分隔。例如,移动_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/