小编Ini*_*ian的帖子

正确的正则表达式在 grep 中不起作用

我有这个正则表达式:

(?<=prefix).*$
Run Code Online (Sandbox Code Playgroud)

它返回字符串“前缀”之后的任何字符,并且在任何在线正则表达式引擎(例如https://regex101.com)上都可以正常工作。问题是当我在 bash 中使用该正则表达式时:

grep '(?<=prefix).*$' <<< prefixSTRING
Run Code Online (Sandbox Code Playgroud)

它不匹配任何东西。为什么该正则表达式不适用于 grep?

grep regular-expression

16
推荐指数
3
解决办法
7696
查看次数

为什么 systemctl\ {restart,status}\ sshd\; 工作?

通过 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)

我有两个问题..

  1. 这种替换和扩展的方法到底叫什么?(以便我可以研究它并了解有关它的更多信息以及如何正确使用它)。
  2. 我在这里做错了什么?为什么不起作用?

command-line bash brace-expansion

14
推荐指数
3
解决办法
1926
查看次数

Shell 脚本:创建一个带有选项的变量

我有一个带有以下参数的 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)

我试过引号、单引号、括号,但没有任何成功。

bash shell-script

12
推荐指数
2
解决办法
1781
查看次数

如何跳过替换每行中第一次出现的字符?

我有一些格式的文件

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)

但是如何替换每行上的每个出现但第一次出现?

sed text-processing

10
推荐指数
5
解决办法
1967
查看次数

文件名中的外壳扩展(A | B)?

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}.txtbash,因为它扩大了范围。是否有一种等效的方法可以仅对几个文件执行此操作?

例如cat file(1|5).txt,只打印那些 2?

shell bash bash-expansion

9
推荐指数
3
解决办法
1933
查看次数

将环境变量从当前 shell 传递到 systemd 单元

我正在尝试将当前 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)

但该值仍然没有反映在 …

environment-variables systemd

8
推荐指数
1
解决办法
2万
查看次数

PCRE-regex 使用 grep 排除捕获组

我使用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)

但这什么也没给我。我在这里缺少什么?

grep text-processing regular-expression pcre

7
推荐指数
1
解决办法
7030
查看次数

bash 中的正则表达式提取第一个分隔符后的字符串

这个问题与这里的任何其他问题都不重复,因为我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}"

shell bash regular-expression

5
推荐指数
1
解决办法
3889
查看次数

Grep 计数匹配 'X' 以上

我试图找出一个匹配高于特定计数的所有计数的命令。我在用

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)

我已经搜索了很多。如果有人能引导我朝着正确的方向前进,那就太棒了。

grep

5
推荐指数
1
解决办法
5304
查看次数

使用参数 2 直到 @ for 循环

我有一个外壳脚本:

#!/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。我该怎么做?

bash

5
推荐指数
1
解决办法
537
查看次数