我经常使用 vim /search 命令来验证我的正则表达式(只是为了看看它匹配什么)。之后我通常使用:%s替换命令,在那里我使用搜索中的正则表达式作为要替换的字符串,例如我首先查找这样的字符串:
/TP-\(\d\{5\}\)-DD-\d\{3\}
Run Code Online (Sandbox Code Playgroud)
它与我想要的完全匹配,所以我进行了替换:
:%s/TP-\(\d\{5\}\)-DD-\d\{3\}/\1/g
Run Code Online (Sandbox Code Playgroud)
但是我必须在这里再次编写整个正则表达式。通常那个正则表达式要长得多,这就是我寻找解决方案的原因:
是否有任何现有的快捷方式或 vim 脚本可以将该搜索模式直接粘贴到替换命令中?
我在终端中使用 vim(没有 gvim)。
以下命令用于搜索 7 位电话号码:
grep "[[:digit:]]\{3\}[ -]\?[[:digit:]]\{4\}" file
Run Code Online (Sandbox Code Playgroud)
代表什么\??
我正在尝试使用正则表达式作为awk. 从我的阅读来看,这似乎是可能的,但我无法正确理解语法。
rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1: ^ unexpected newline or end of string
Run Code Online (Sandbox Code Playgroud)
想法?如果不是显而易见的,目标是获取没有版本号的软件列表。
假设文件中有一些文本:
(bookmarks
("Chapter 1 Introduction 1" "#1"
("1.1 Problem Statement and Basic Definitions 23" "#2")
("Exercises 31" "#30")
("Notes and References 42" "#34"))
)
Run Code Online (Sandbox Code Playgroud)
"如果有一个,我想给每个数字加上 11,然后在每一行中加上一个,即
(bookmarks
("Chapter 1 Introduction 12" "#12"
("1.1 Problem Statement and Basic Definitions 34" "#13")
("Exercises 42" "#41")
("Notes and References 53" "#45"))
)
Run Code Online (Sandbox Code Playgroud)
这是我使用 GNU AWK 和正则表达式的解决方案:
awk -F'#' 'NF>1{gsub(/"(\d+)\""/, "\1+11\"")}'
Run Code Online (Sandbox Code Playgroud)
即,我想替换(\d+)\"为 \1+10\",\1代表 的组在哪里(\d+)。但它不起作用。我怎样才能让它工作?
如果 gawk 不是最好的解决方案,还有什么可以使用的?
我经常需要创建在脚本中使用的正则表达式(主要是在 中使用时sed),但是,我发现,有时正则表达式会变得非常复杂,我很难理解和编辑。是否有任何软件可以让人们直观地创建正则表达式的代码,然后我可以将其复制并粘贴到脚本中?
我喜欢grep -v。我用它所有的时间。但我也在用 python 做一些文本处理,我缺少一件至关重要的事情。
通常,我grep -v习惯从文本中去除无关的东西。
例如,
$ grep -v '[a-z]'
# (I manually review this output to confirm that I don't want those lines)
$ grep '[a-z]' > linesiwanted
Run Code Online (Sandbox Code Playgroud)
但是如何在 Python 中匹配正则表达式的补码?例如,\w?
说我有这样的行:
*[234]*
*[23]*
*[1453]*
Run Code Online (Sandbox Code Playgroud)
where*代表任何字符串(除了形式为 的字符串[number])。如何使用命令行实用程序解析这些行并提取括号之间的数字?
更一般地,它的这些工具cut,sed,grep或awk将适合这样的任务?
是否可以在一个班轮中完成?
我有这样的输出:
"First line" - Description
" Second line" - Description
"Third line" - Description
" Fourth line" - Description
Run Code Online (Sandbox Code Playgroud)
此输入是自动生成的。
我想用每行的(引号)替换第一次出现的"(引号+空格)"。如果我在全局范围内应用替换,它也会更改line" -to 的每次出现line"-,所以我想知道是否可以使用 sed one liner 来完成此操作。
我已经尝试使用^这样的
sed -r ':a;N;$!ba;s/(\^\" )/\"/g'
Run Code Online (Sandbox Code Playgroud)
但它不起作用,它不能代替任何东西。我试过
sed -r ':a;N;$!ba;s/(^|\" )/\"/g'
Run Code Online (Sandbox Code Playgroud)
它替换了所有的出现。我刚刚开始使用 sed,所以我真的不知道我做错了什么。
我在这里缺少什么?
我想在awk. 下面是一个例子:
echo "@article{gjn, Author = {Grzegorz J. Nalepa}, " | awk '{ sub(/@.*,/,""); print }'
Run Code Online (Sandbox Code Playgroud)
是否可以编写一个选择较短字符串的正则表达式?
@article{gjn,
Run Code Online (Sandbox Code Playgroud)
而不是这个长字符串?:
@article{gjn, Author = {Grzegorz J. Nalepa},
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果:
Author = {Grzegorz J. Nalepa},
Run Code Online (Sandbox Code Playgroud)
echo " ,文章{gjn, Author = {Grzegorz J. Nalepa}, " | awk '{ sub(/ , [^,]*,/,""); 打印 }'
? ?^^^^^
请注意,我将输入字符串和正则表达式的第一个位置中的@字符更改为逗号 ( ,) 字符(也更改.*为[^,]*)。是否可以编写一个选择较短字符串的正则表达式?
, Author = {Grzegorz J. Nalepa},
Run Code Online (Sandbox Code Playgroud)
而不是更长的字符串?:
,article{gjn, Author = {Grzegorz J. Nalepa},
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果:
,article{gjn
Run Code Online (Sandbox Code Playgroud) 我知道我们可以转义像*(){}$with\这样的特殊字符,以便将其视为文字。
例如\*或\$
但是如果.我必须做两次,\\.否则它被认为是特殊字符。例子:
man gcc | grep \\.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
grep shell-script quoting regular-expression escape-characters