英文:
How do I get and format the contents of a bunch of text files (md5sums) in Linux?
问题
I have a bunch of md5 files, which have a hash and a path/filename. I want to output the hash and filename, but not the path.
Example file contents:
d7b7494a0602d91b391848dfaebec7ac /home/develop/md5sums/file1.md5
Desired output:
d7b7494a0602d91b391848dfaebec7ac file1.md5
My current attempts from searches so far are:
cat *.md5 | xargs -0 sed -i 's/\/home\/develop\/md5sums\///g'
(Gives an error e.g. for file3.md5: sed: 2: "bf60fb26cbe1f4e9e4001aa ...": extra characters at the end of d command
)
cat *.md5 | xargs -I '{}' sed -i 's/\/home\/develop\/md5sums\////g'
(Gives an error e.g. for file3.md5: sed: -I or -i may not be used with stdin
)
I can probably figure out how to solve it with a for
loop, but ideally I'd like to keep it as a piped one-liner if possible, and I think there should be a way for cat
/xargs
/sed
to work, I just can't figure it out!
The path is hardcoded, so I don't feel the need to use basename
, particularly as the md5 file contains more than just the path/file, which I think makes it more tricky!
英文:
I have a bunch of md5 files, which have a hash and a path/filename. I want to output the hash and filename, but not the path.
Example file contents:
d7b7494a0602d91b391848dfaebec7ac /home/develop/md5sums/file1.md5
Desired output:
d7b7494a0602d91b391848dfaebec7ac file1.md5
dd036a1e1c16b3488309a75f80e5eb92 file2.md5
bf60fb26cbe1f4e9e4001aa485b89ff8 file3.md5
My current attempts from searches so far are:
cat *.md5 | xargs -0 sed -i 's/\/home\/develop\/md5sums\///g'
(Gives an error e.g. for file3.md5: sed: 2: "bf60fb26cbe1f4e9e4001aa ...": extra characters at the end of d command
)
cat *.md5 | xargs -I '{}' sed -i 's/\/home\/develop\/md5sums\////g'
(Gives an error e.g. for file3.md5: sed: -I or -i may not be used with stdin
)
I can probably figure out how to solve it with a for
loop, but ideally I'd like to keep it as a piped one-liner if possible, and I think there should be a way for cat
/xargs
/sed
to work, I just can't figure it out!
The path is hardcoded, so I don't feel the need to use basename
, particularly as the md5 file contains more than just the the path/file, which I think makes it more tricky!
答案1
得分: 2
尝试:
sed 's: .*/: :' *.md5
输出:
d7b7494a0602d91b391848dfaebec7ac file1.md5
你的尝试没有成功,因为你使用了`-i`选项,这会原地编辑文件。但是,要做到这一点,sed需要直接访问这些文件。当从管道中读取cat时,sed只能看到文件的串联内容,无法知道它们的位置,因此无法编辑它们。这就是你得到的错误的含义。但是当我们直接将文件列表传递给sed时,它就能够编辑它们。
英文:
Try:
sed 's: .*/: :' *.md5
Output:
d7b7494a0602d91b391848dfaebec7ac file1.md5
Your attempts didn't work, because you used the -i
option, which edits the files in-place. But to do that, sed needs to access those files directly. When reading from a piped cat, sed can only see the concatenated contents of the files, it cannot know their location, and therefore can't edit them. That's what the error you got meant. But when we pass the list of files directly to sed, it's able to edit them.
答案2
得分: 1
这里捕获哈希值、路径和路径的最后一部分,并将其替换为哈希值(\1
)和最后一部分(\3
)。
英文:
You can use this:
sed -E 's:([0-9a-f]+)[[:space:]]+/(.+/)*([^/]+)$: :g' file.md5
Here we capturing hash, path and last segment of a path and replacing it with hash (\1
) and last segment (\3
).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论