我知道可以匹配一个单词,然后使用其他工具(例如grep -v)反转匹配.但是,我想知道是否可以使用正则表达式匹配不包含特定单词的行(例如hede).
输入:
hoho
hihi
haha
hede
Run Code Online (Sandbox Code Playgroud)
码:
grep "<Regex for 'doesn't contain hede'>" input
Run Code Online (Sandbox Code Playgroud)
期望的输出:
hoho
hihi
haha
Run Code Online (Sandbox Code Playgroud) 拿这个正则表达式:/^[^abc]/.这将匹配字符串开头的任何单个字符,a,b或c除外.
如果你*在它之后添加- /^[^abc]*/- 正则表达式将继续将每个后续字符添加到结果中,直到它遇到a a,或 b,或 c.
例如,使用源字符串"qwerty qwerty whatever abc hello",表达式将匹配"qwerty qwerty wh".
但是如果我想要匹配的字符串呢? "qwerty qwerty whatever "
...换句话说,我怎样才能匹配到(但不包括)确切序列的所有内容 "abc"?
我试图输出一个字符串,其中包含字符串的两个单词之间的所有内容:
输入:
"Here is a String"
Run Code Online (Sandbox Code Playgroud)
输出:
"is a"
Run Code Online (Sandbox Code Playgroud)
使用:
sed -n '/Here/,/String/p'
Run Code Online (Sandbox Code Playgroud)
包括端点,但我不想包含它们.
如何将HTML表格(<table>)的内容转换为CSV格式?是否有库或linux程序执行此操作?这类似于Internet Explorer中的复制表,并将它们粘贴到Excel中.
无论如何你可以使用sed像java正则表达式模式/匹配/组一样做正则表达式匹配组吗?
如果我有字符串
test-artifact-201251-balbal-0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)
我如何使用sed只是为了得到如下结果:
test-artifact-0.1-SNASHOT.jar
Run Code Online (Sandbox Code Playgroud)
我想知道sed允许你做一些像java正则表达式的东西,你定义的模式如下:
([a-z]*-[a-z]*-)([0-9]*-)([a-z]*-)([.]*SNAPSHOT.jar)
Run Code Online (Sandbox Code Playgroud)
然后你可以得到如下数组的结果:
test-artifact-
201251-
balbal-
0.1-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud) 我试图提取下面给出的数字,但屏幕上没有任何内容:
echo "This is an example: 65 apples" | sed -n 's/.*\([0-9]*\) apples/\1/p'
Run Code Online (Sandbox Code Playgroud)
但是,如果两个数字分别匹配,我得到'65',如下所示:
echo "This is an example: 65 apples" | sed -n 's/.*\([0-9][0-9]\) apples/\1/p'
65
Run Code Online (Sandbox Code Playgroud)
如何匹配一个数字,以至于我不知道要提取的数字中的位数,例如它可以是2344而不是65?
每当我git log --all --graph --oneline --decorate在终端模拟器中查看输出时,都会在终端屏幕的顶部查看第一次提交。当我用 退出git log输出视图时q, 中的几行不再可见,因为屏幕底部附加了一些新行,用于下一个命令。
不过,通常这些顶行是最有趣的,因为它们类似于最近的 git 历史记录,所以我希望它们在我输入下一个 git 命令时仍然可见。
如何使git log输出显示在屏幕底部,即在底部查看第一个提交?您必须向上滚动才能查看较旧的提交。
注意:--reverse出于两个原因,该标志不是一个选项。
--graph标志结合:fatal: cannot combine --reverse with --graph。我正在尝试将sed脚本迁移到perl单行代码,因为perl支持非贪婪的正则表达式。我是否已从sed中的非贪婪(勉强)正则表达式匹配中获取建议?而为什么我的Perl就地脚本,即使它没有一个零退出代码退出?
如果打开文件失败,我需要oneliner以非零状态退出。
不幸的是,检查-f $ARGV[0]是不可靠的,因为该文件可能存在并且仍然无法访问。
一种想法是在命令行的所有文件之间添加一些perl代码来执行,但是我找不到一个。END执行一次,如果最后一个文件成功执行,则不会知道先前的文件失败。
touch aaa.txt
chmod 000 aaa.txt
perl -i -pe 'BEGIN { -f $ARGV[0] or die "fatal: " . $!; }' aaa.txt; echo $?
Run Code Online (Sandbox Code Playgroud)
_
Can't open aaa.txt: Permission denied.
0
Run Code Online (Sandbox Code Playgroud) 使用 GNU sed(-r为了清楚起见,使用标志),输入字符串上的以下两个替换ab给出相同的结果:
s/(.)(.)|(.)(.)$/\2\1\3\4/
Run Code Online (Sandbox Code Playgroud)
和
s/(.)(.)$|(.)(.)/\1\2\4\3/
Run Code Online (Sandbox Code Playgroud)
两者都给ba. 看起来,替代方案(.)(.)(没有 的那个$)在两次替换中都成功,无论其位置是第一个还是第二个替代方案。为什么会这样呢?这种替代方案的决定因素是什么?
正则表达式的 POSIX 规范指定1当替代方案从不同位置开始时(在这种情况下,优先选择较早的一个),以及当它们从相同位置开始但具有不同长度(优先选择较长的一个)时,决胜局,但是当两个替代方案从相同位置开始且具有相同长度时,它似乎没有指定捕获组的行为,因此将其留给具体实现。
对匹配序列的搜索从字符串的开头开始,并在找到与表达式匹配的第一个序列时停止,其中“first”被定义为表示“在字符串中最早开始”。如果模式允许可变数量的匹配字符,因此从该点开始有多个这样的序列,则匹配最长的这样的序列。[...] – The Open Group 基本规范第 7 期,2018 年版
这是该现象的一个运行示例。
s/(.)(.)|(.)(.)$/\2\1\3\4/
Run Code Online (Sandbox Code Playgroud)
我知道另一个非常相似的问题,但由于某种原因,我仍然遇到问题.
我有一个GC日志,我正试图删除随附的Tenured部分[].
63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]
Run Code Online (Sandbox Code Playgroud)
我申请 s/\[Tenured:.*\]//
并且非常期待,结果在整个线路的剩余部分贪婪地修剪:
63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546:
Run Code Online (Sandbox Code Playgroud)
所以,让我们尝试非贪婪不匹配右边括号,s/\[Tenured:[^\]]*\]//但唉没有匹配,sed跳过线,产生相同的原始输出:
63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]
Run Code Online (Sandbox Code Playgroud)
我如何非贪婪地匹配和替换该部分?谢谢,