考虑以下行(如在目录中):
6.1.34.2 Some text
(“2”后面有一个标签)。
当搜索到^\d\+[.]\d\+[.]\d\+[^.]
选定的行(并从“6”到“4”)时,恕我直言,由于测试用例中的最后一个点,这是不正确的。
^\d\+[.]\d\+[.]\d\+\s
未选择该线(如预期)。
我的问题是,第一个正则表达式有什么问题?
考虑以下行(如在目录中):
6.1.34.2 Some text
(“2”后面有一个标签)。
当搜索到^\d\+[.]\d\+[.]\d\+[^.]
选定的行(并从“6”到“4”)时,恕我直言,由于测试用例中的最后一个点,这是不正确的。
^\d\+[.]\d\+[.]\d\+\s
未选择该线(如预期)。
我的问题是,第一个正则表达式有什么问题?
我正在尝试找出一个 awk 命令/脚本来从一个大文件中提取一段文本。我感兴趣的文件子部分如下:
Board Info: #512
Manufacturer: "Dell Inc."
Product: "0X3D66"
Version: "A02"
Serial: "..CN7016343F00IE."
Chassis Info: #768
主板信息和底盘信息行有 2 个前导空格,而缩进块有 4 个。我不想假设结束行以底盘信息开头(可能是其他内容),而只是依靠以 2 个空格开头的“下一行”。
这:
awk '/^\s{2}Board Info/,/^\s{2}[^B ]/' dump.txt
解决了这个特定的实例,但是如果不是“底盘信息”,结束块行以字母 B 开头(例如,BOM),则不起作用。
如果我使用:
awk '/^\s{2}Board Info/,/^\s{2}\S*/' dump.txt
结尾模式也与“Board Info”行匹配,所以我只获取了该行。如何在不硬编码结尾块(如上所述)的情况下获取缩进的块(前导 4 个空格),并且不依赖结尾模式“下一行恰好以 2 个前导空格开头”?
我一直在努力寻找一个可以捕获从不太干净的 pdf 文件中提取的数据的正则表达式:
每行应包含 1. 学校 ID(5 位数字)、2. 学校名称、3. 申请编号(编号)、4. 另一个编号(=offer#)
清晰的一行看起来像“10394 ABC School 50 34”,可以使用 捕获([0-9]{5})\s{2,}(\D+)\s+(\d*)\s+(\d*)
。正常情况看起来像https://regex101.com/r/Mwv3bJ/1,忽略负向后视。
我遇到的问题是,一些学校的名称中包含部分邮政编码(1 或 2 个字母后跟 1 或 2 个数字,例如 W19 或 SW2),因此“10422 XYZ College W9 60 33”将被捕获为 (id: 10422)(school: XYZ College W)(applications: 9)(offers: 60)。https: //regex101.com/r/YeNmT7/1
我希望 (3:application#) 不捕获任何紧跟字母的数字,并且如果名称中存在这样的 \D{1,2}\d{1,2},则用 (2:school name) 捕获。我尝试使用非捕获组 (?:^\D{1,2}\d{1,2}$) 来去除任何潜在的邮政编码,但无效。
例子:
请指教。
我试图用正则表达式精确匹配“SA..”的这些变体(SAC、SAD、SAE、SAP、SAW、SAAC、SAAN、SAAS、SABE、SABW),但不区分大小写。
问题是每个单词的每个字符之间可能存在一个或多个分隔符(空格、反斜杠 /、点 . 、连字符 -),例如“ S /AC”、“SA.P”、“S / AB W”。
我最终得到了下面的模式,是的,它有效,但它很丑而且很长!:
有没有更好更紧凑的模式?
Option Explicit
Option Compare Text
Function MatchSAWord(ByVal inputText As String) As Boolean
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
Dim sep As String, pat As String
sep = "[ .\/-]*"
pat = "\b(" & _
"S" & sep & "A" & sep & "C" & "|" & _
"S" & sep & "A" & sep & "D" & "|" & _
"S" & sep & "A" & sep & "E" & "|" & _
"S" & sep & "A" & sep & "P" & "|" & _
"S" & sep & "A" & sep & "W" & "|" & _
"S" & sep & "A" & sep & "A" & sep & "C" & "|" & _
"S" & sep & "A" & sep & "A" & sep & "N" & "|" & _
"S" & sep & "A" & sep & "A" & sep & "S" & "|" & _
"S" & sep & "A" & sep & "B" & sep & "E" & "|" & _
"S" & sep & "A" & sep & "B" & sep & "W" & _
")\b"
With regex
.Global = False
.IgnoreCase = True
.pattern = pat
End With
MatchSAWord = regex.Test(inputText)
End Function
我将 mkfs 的输出转储到日志文件中,但它以交互方式显示其进程,打印退格键以使光标返回,然后打印空格以删除,然后再次执行退格键并打印新消息。
在日志里看起来乱糟糟的。以下是我找到的办法,把一组 BS 合并到单个空间里。
# echo -e "AAABBB\x08\x08\x08\x08\x08\x08CCC" | sed -e 's/\(\x08\)\1\+/\1/g' -e 's/\(\x08\)/x/'
AAABBBxCCC
但是有没有更好的方法可以用正则表达式将 BSs + 空格 + BSs ... 序列折叠成单个空格字符?我可以编写二进制文件来实现,但在我看来,这有点矫枉过正……
示例输入为
# echo -e "123\x08\x08\x08 \x08\x08\x08456 789"
转换为
123 456 789
更新:一开始我说的是 mkfs 输出的。我给你看个例子,方便你理解字符集。
mke2fs 1.47.0 (5-Feb-2023)
fs_types for mke2fs.conf resolution: 'ext4'
Discarding device blocks: 0/16463361572864/1646336 done
Filesystem label=data_volume
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
412080 inodes, 1646336 blocks
82316 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1686110208
51 block groups
32768 blocks per group, 32768 fragments per group
8080 inodes per group
Filesystem UUID: c27f71c7-2d9e-4a33-9d54-449ab3e2f378
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: 0/51 done
Writing inode tables: 0/51 done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: 0/51 done
退格键未显示在上面的窗口中(复制粘贴后它们被删除)。
例如,我有一些文本
aaa foo
bbb foo
ccc foo?
ddd foo
eee foo?
...
我想搜索所有foo
不带 s 的字符?
,例如上面文本中的第 1,2,4 行。该怎么做?
我想询问如何使用 sed 和正则表达式从文件中提取特定字符串。
以下是输入文本文件(testfile.txt)的示例:
# This file contains a short description of the columns in the
# meta-analysis summary file, named '/some/output/directory/result.txt'
# (Skipping some comment lines...)
# Input for this meta-analysis was stored in the files:
# --> Input File 1 : /some/input/directory/cohort1/dataset1_chrAll.regenie.txt
# --> Input File 2 : /some/input/directory/cohort2/subdir1/chrAll-out.txt
# --> Input File 3 : /some/input/directory/cohort2/subdir2/chrAll-out_ver2.txt
# --> Input File 4 : /some/input/directory/cohort3/resfile.txt
# --> Input File 5 : /some/input/directory/cohort4/regenie_res_chrAll.txt
从这个文件,我想提取输入文件名的列表,因此结果应该是这样的:
/some/input/directory/cohort1/dataset1_chrAll.regenie.txt
/some/input/directory/cohort2/subdir1/chrAll-out.txt
/some/input/directory/cohort2/subdir2/chrAll-out_ver2.txt
/some/input/directory/cohort3/resfile.txt
/some/input/directory/cohort4/regenie_res_chrAll.txt
以下是我尝试过的:
这是我使用的初始命令。
cat testfile.txt | sed -e 's/\/some\/input\/directory\/([A-z0-9\/\.\-]*)\.txt/$1/g'
结果:
sed: -e expression #1, char 55: Invalid range end
经过一番搜索后,我尝试使用反斜杠转义括号。
cat testfile.txt | sed -e 's/\/some\/input\/directory\/\([A-z0-9\/\.\-]*\).txt/$1/g'
结果:
sed: -e expression #1, char 56: Invalid range end
所以它并没有解决问题。
我也尝试过转义括号。
cat testfile.txt | sed -e 's/\/some\/input\/directory\/\(\[A-z0-9\/\.\-\]\*\)\.txt/$1/g'
结果:
# This file contains a short description of the columns in the
# meta-analysis summary file, named '/some/output/directory/result.txt'
# (Skipping some comment lines...)
# Input for this meta-analysis was stored in the files:
# --> Input File 1 : /some/input/directory/cohort1/dataset1_chrAll.regenie.txt
# --> Input File 2 : /some/input/directory/cohort2/subdir1/chrAll-out.txt
# --> Input File 3 : /some/input/directory/cohort2/subdir2/chrAll-out_ver2.txt
# --> Input File 4 : /some/input/directory/cohort3/resfile.txt
# --> Input File 5 : /some/input/directory/cohort4/regenie_res_chrAll.txt
这并没有引发错误,但这不是我想要的。
最后,我尝试添加 -r 选项,但不转义括号或方括号。
cat testfile.txt | sed -re 's/\/some\/input\/directory\/([A-z0-9\/\.\-]*)\.txt/$1/g'
结果:
sed: -e expression #1, char 55: Invalid range end
第一次尝试时显示相同的错误消息。
我想问我的命令行中存在什么问题以及是否有任何可能的解决方案。
谢谢。
在以下情况下,需要通过正则表达式从字符串中提取父项
input_string = "02150 ESPOO"
input_string[pattern]
无论pattern
正则表达式是否是书尾(开始和结束),都会出现两种截然不同的结果/^\d{5}$/
/\d{5}/
在后一种情况下,我得到了期望的结果,而前一种情况则返回nil
。为什么 bookened 正则表达式会失败?
我想建立一个正则表达式,以匹配代表$
正则表达式的字符串中的所有未转义的内容。
在这种情况下,如果字符后面包含相同数量的反斜杠,则该字符不会被转义(每对反斜杠代表反斜杠字符本身,因此下一个字符不会被转义)。
我想出了这个模式:
(?<!\\)(\\{2})*\$
解释:虽然这也会匹配 前面的反斜杠$
,但这是我找到的最接近的解决方案。这确保了 前面的反斜杠数量相等,$
而 前面没有其他反斜杠,因此反斜杠数量为奇数。
我的问题是,似乎我需要 2 个连续的非消耗组才能使反斜杠总数相等,但这是不可能的。还有其他方法可以做到这一点吗?
如何使用正则表达式查找/替换来换行,以便每行不会超过 20 个符号?
我发现了这个:
Find: \s(?<=.{20})
Replace: $0\r\n
这将是完美的,但是如果单词在 20 个符号之前开始,那么它会将大于 20 个符号的单词留在行中。
我需要一个类似的表达式,但是如果最后一项使行变大,它也应该转到新行,因此最后一行总是会有<20个符号。
我知道我很久以前就做过这个,也许是用了一些插件,但现在我无法让它工作。我该怎么做?