我有一个看起来像这样的文件:
$ some random
$ text
00ab2c3f03$ and more
random text
1a2bf04$ more text
blah blah
以及看起来像这样的代码:
sed -ne 's/\(.*\)$ and.*/\1/p' "file.txt" > "output1.txt"
sed -ne 's/\(.*\)$ more.*/\1/p' "file.txt" > "output2.txt"
这给了我00ab2c3f03
和1a2bf04
因此它从行的开头提取任何内容到shell prompt
并将其存储在文件中,两次用于两个不同的实例。
问题是文件有时看起来像这样:
/dir # some random
/dir # text
00ab2c3f03/dir # and more
random text
345fabd0067234234/dir # more text
blah blah
我想制作一个通用的提取器:
hex
数据,直到第一个non-hex
数字但我sed
实际上并没有想到一个简单的解决方案......
答案 0 :(得分:1)
我认为你想要这样的输出,
$ cat file
$ some random
$ text
00ab2c3f03$ and more
random text
1a2bf04$ more text
blah blah
/dir # some random
/dir # text
00ab2c3f03/dir # and more
random text
345fabd0067234234/dir # more text
blah blah
$ sed -ne 's/\([a-f0-9]*\).* and more.*/\1/p' file
00ab2c3f03
00ab2c3f03
$ sed -ne 's/\([a-f0-9]*\).* more text.*/\1/p' file
1a2bf04
345fabd0067234234
您也可以尝试使用以下GNU sed
命令。由于输入中存在/
,我将sed分隔符更改为~
,
$ sed -nr 's~([a-f0-9]*)\/*\$*.* and more.*~\1~p' file
00ab2c3f03
00ab2c3f03
$ sed -nr 's~([a-f0-9]*)\/*\$*.* more text.*~\1~p' file
1a2bf04
345fabd0067234234
说明:
([a-f0-9]*)
- 捕获所有hexdigits并将其存储到一个组中。
OP表示可能会在十六进制数字后面出现/
或$
符号,因此正则表达式应为\/*\$*
(/
零或更多捕获组后的次数,$
零次或多次。
第一个命令仅适用于包含字符串and more
的行。
第二个仅适用于包含more text
的行,因为操作系统希望将两个输出放在两个不同的文件中。
答案 1 :(得分:0)
这对我来说似乎更好:
sed -nr 's#([[:xdigit:]]+)[$/].*#\1#p' file