我有两个档案:
1st: Entries.txt
confirmation.resend
send
confirmation.showResendForm
login.header
login.loginBtn
第二名: Used_Entries.txt
confirmation.showResendForm = some value
login.header = some other value
我想找到第一个文件中的所有条目( Entries.txt ),这些条目尚未在第二个文件中作为一个值( Used_Entries.txt )
在此示例中,我希望以下结果:
confirmation.resend
send
login.loginBtn
结果confirmation.showResendForm
和login.header
未显示,因为它们存在于 Used_Entries.txt
我该怎么做?我一直在玩正则表达式,但还没有能够解决它。 bash脚本或某事物将非常感谢!
答案 0 :(得分:1)
你可以用正则表达式做到这一点。但是请准备好您的代码情绪,因为您无法同时将这两个文件与正则表达式匹配,而我们执行希望同时将这两个内容与正则表达式匹配。好吧,这意味着你必须至少对你的语言有一些了解,我希望你能连接两个文件中的内容,中间至少有一个新行。
此正则表达式解决方案希望您的字符串匹配为以下格式:
text (no equals sign)
text
text
...
key (no equals sign) ␣ (optional whitespace) = (literal equal) whatever (our regex will skip this part.)
key=whatever
key=whatever
我引起你的注意吗?是?请参阅以下正则表达式(使用大多数正则表达式引擎可访问的技术):
/(^[^=\n]+$)(?!(?s).*^\1\s*=)/m
受到a recent answer I saw from zx81的启发,您可以切换到中间的(?s)
标记以突然切换到DOTALL模式,这样您就可以开始与.
进行多行匹配在RegExp中间。使用这种技术和上面的设置语法,这是正则表达式的作用,如解释:
(^[^=\n]+$)
浏览所有text (no equals sign)
元素。在捕获中强制执行等号或换行符。这意味着我们的正则表达式将每个text
元素作为一行命中,并尝试将其恰当地匹配。(?!
打开一个负向前瞻组。断言此匹配将不找到以下内容:(?s).*
任意数量的字符或新行 - 由于这是一个贪婪的匹配,会将我们的匹配器指针抛到字符串的最后,跳到文档的最后部分以便快速回溯并快速挖掘^\1\s*=
捕获的密钥,在一些可选的空格后面跟一个等号,在它自己的行中。)
结束我们的小组。A regex demo with more test cases
我很蠢。我本可以这样说的:
/(^[^=\n]+$)(?!.*^\1\s*=)/sm
答案 1 :(得分:0)
import re
e=open("Entries.txt",'r')
m=e.readlines()
u=open("Used_Entries.txt",'r')
s=u.read()
y=re.sub(r"= .*","",s)
for i in m:
if i.strip() in [k.strip() for k in y.split("\n")] :
pass
else:
print i.strip()
答案 2 :(得分:0)
我一直在努力解决这个问题,只是用scala中的一个小脚本解决了这个问题:
import scala.io.Source
object HelloWorld {
def main(args: Array[String]) {
val entries = (for(line <- Source.fromFile("Entries.txt").getLines()) yield {
line
}).toList
val usedEntries = (for(line <- Source.fromFile("Used_Entries.txt").getLines()) yield {
line.dropRight(line.length - line.indexOf(' '))
}).toList
println(entries)
println(usedEntries)
val missingEntries = (for {
entry <- entries
if !usedEntries.exists(_ == entry)
} yield {
entry
}).toList
println(missingEntries)
println("Missing Entries: ")
println()
for {
missingEntry <- missingEntries
} yield {
println(missingEntry)
}
}
}