我有这个正则表达式:
(?<=prefix).*$
Run Code Online (Sandbox Code Playgroud)
它返回字符串“前缀”之后的任何字符,并且在任何在线正则表达式引擎(例如https://regex101.com)上都可以正常工作。问题是当我在 bash 中使用该正则表达式时:
grep '(?<=prefix).*$' <<< prefixSTRING
Run Code Online (Sandbox Code Playgroud)
它不匹配任何东西。为什么该正则表达式不适用于 grep?
通过 echo 时上述命令的输出是:
# echo systemctl\ {restart,status}\ sshd\;
systemctl restart sshd; systemctl status sshd;
Run Code Online (Sandbox Code Playgroud)
即使我将输出粘贴到终端,该命令也能工作。但是当我尝试直接运行命令时,我得到:
# systemctl\ {restart,status}\ sshd\;
bash: systemctl restart sshd;: command not found...
Run Code Online (Sandbox Code Playgroud)
我有两个问题..
我有一个带有以下参数的 rsync 命令:
rsync -avz --{partial,stats,delete,exclude=".*"}
Run Code Online (Sandbox Code Playgroud)
我想将该参数放在一个变量中,以便在脚本中重用它。像这样的东西:
#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2
Run Code Online (Sandbox Code Playgroud)
我试过引号、单引号、括号,但没有任何成功。
我有一些格式的文件
Y15-SUB-B04-P17-BK_M02734_4_000000000-ANNUF_1_1111_24724_4878;size=1;
Y15-SUB-B05-P22-LM_M02734_4_000000000-ANNUF_1_1111_20624_14973;size=1;
Y15-SUB-B05-P22-LM_M02734_4_000000000-ANNUF_1_1103_11326_10379;size=1;
Run Code Online (Sandbox Code Playgroud)
我希望用冒号 (:) 替换每个出现的下划线 (_),除了第一个。我想要这样的输出:
Y15-SUB-B04-P17-BK_M02734:4:000000000-ANNUF:1:1111:24724:4878;size=1;
Y15-SUB-B05-P22-LM_M02734:4:000000000-ANNUF:1:1111:20624:14973;size=1;
Y15-SUB-B05-P22-LM_M02734:4:000000000-ANNUF:1:1103:11326:10379;size=1;
Run Code Online (Sandbox Code Playgroud)
我知道我可以sed -i '' 's/_/:/g' old_file
用来替换 ALL(或sed 's/_/:/g' old_file > new_file
),并且我可以添加数字来仅替换第 2 次、第 4 次左右的出现:
sed 's/_/:/2' old_file > new_file
Run Code Online (Sandbox Code Playgroud)
但是如何替换每行上的每个出现但第一次出现?
or
例如,在读取文件时是否可以在 shell 中扩展选项。
我的意思是,例如,grep
支持(A|B)
在文件中匹配 A 或 B 之类的语法。
同样,如果我有这些文件:
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt
Run Code Online (Sandbox Code Playgroud)
我能做到cat file{1..5}.txt
的bash
,因为它扩大了范围。是否有一种等效的方法可以仅对几个文件执行此操作?
例如cat file(1|5).txt
,只打印那些 2?
我正在尝试将当前 shell 中定义的环境变量传递给systemd
我正在编写的单元之一。
DB_URL=databus.dev.mysite.io:8080
Run Code Online (Sandbox Code Playgroud)
我在作为服务运行的 python 脚本中使用它。我的systemd
单位将把这个脚本作为一个单位运行,利用变量来工作。
[Unit]
Description=device-CompStatus: Computes device availability status
[Service]
Type=simple
ExecStart=/usr/bin/bash -c "/usr/bin/python /opt/deviceCompStatus/deviceCompStatusHandler.py"
Restart=always
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)
在 Python 脚本中使用变量的方式是
if os.environ.get('DB_URL') is not None:
dbEndPoint = "http://" + os.environ['DB_URL']
Run Code Online (Sandbox Code Playgroud)
问题是在systemd
. 我查找了几个资源在 systemd 单元中使用环境变量,它说[Service]
直接在下面使用赋值作为
[Service]
Environment=DB_URL=databus.dev.mysite.io:8080
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的机器DB_URL
可能会根据我部署机器的环境而改变,它可能是开发人员,也可能是生产设置,其中 URL 会有所不同。
我如何动态地做到这一点?即传递任何可DB_URL
用于systemd
环境的值?
我还尝试使用该EnvironmentFile=
选项来定义文件并将其传递给服务。但同样的问题,我的变量可能是动态的,不能硬编码。
使用该选项后
systemctl import-environment DB_URL
Run Code Online (Sandbox Code Playgroud)
我能够看到systemd
我确认的环境中可用的变量
systemctl show-environment
DB_URL=databus.dev.mysite.io:8080
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)
但该值仍然没有反映在 …
我使用GNU grep
与-P
从文件字符串匹配PCRE正则表达式的支持。输入文件的行包含如下字符串:
FOO_1BAR.zoo.2.someString:More-RandomString (string here too): 0.45654343
Run Code Online (Sandbox Code Playgroud)
我想捕捉的数字2
,并0.45654343
从上面的线。我使用了正则表达式
grep -Po ".zoo.\K[\d+](.*):\ (.*)$" file
Run Code Online (Sandbox Code Playgroud)
但这给我带来了一个结果
2.someString:More-RandomString (string here too): 0.45654343
Run Code Online (Sandbox Code Playgroud)
我能够从第一个捕获组中获取第一个数字 as 2
,并且还可以匹配行尾的捕获组。但我无法跳过两个捕获组之间的单词/行。
我知道我有一个小组(.*)
在中间捕捉这些词。我试图做的是包括另一个\K
忽略它
grep -Po ".zoo.\K[\d+](.*):\K (.*)$" file
Run Code Online (Sandbox Code Playgroud)
但这只给了我第二个捕获组 as 0.556984
。
还有一个非捕获组,其(?:)
语法为
grep -Po ".zoo.\K[\d+](?=.someString:More-RandomString (string here too)):\ (.*)$"
Run Code Online (Sandbox Code Playgroud)
但这什么也没给我。我在这里缺少什么?
这个问题与这里的任何其他问题都不重复,因为我regex
需要bash
匹配=~
。
假设我有一个像这样的字符串
string="ananas1kiwi2apple1banana2tree"
Run Code Online (Sandbox Code Playgroud)
我regEx
尝试的是
[[ $string =~ .*2([[:alnum:]]{1,}) ]] && subString=${BASH_REMATCH[1]}
Run Code Online (Sandbox Code Playgroud)
它应该匹配 的出现2
并捕获除此之外的所有内容,它仅返回我tree
(第二次匹配后的字符串)。我的预期输出是apple1banana2tree
我知道缺少一个简单的构造,但不确定是哪个。我只寻找bash
regEx
基于纯的解决方案。我知道也没有任何字符串操作可以通过"{string#*2}"
我试图找出一个匹配高于特定计数的所有计数的命令。我在用
grep -src 'Bicycle' /cygdrive/c/Documents/* |grep -v ':0$'
Run Code Online (Sandbox Code Playgroud)
输出是:
/cygdrive/c/Documents/blahhh.txt:1
/cygdrive/c/Documents/blahhh.txt:3
/cygdrive/c/Documents/bla0.txt:5
/cygdrive/c/Documents/blahg.txt:23
Run Code Online (Sandbox Code Playgroud)
但我只希望它输出:
/cygdrive/c/Documents/blahg.txt:23
Run Code Online (Sandbox Code Playgroud)
我已经搜索了很多。如果有人能引导我朝着正确的方向前进,那就太棒了。
我有一个外壳脚本:
#!/bin/bash
exec_command -k -q $1
for i in $@
do
grep --color=always "$i" file
done
Run Code Online (Sandbox Code Playgroud)
我将脚本称为
./grepskript -v searchstring1 searchstring2
Run Code Online (Sandbox Code Playgroud)
我想使用循环的第一个参数exec_command
和所有其他参数do
。我该怎么做?