gre*_*reg 3 linux string bash shell sed
我想做这样的事情:
sed "/^[^+]/ s/\(.*$1|$2.*$\)/+\ \1/" -i file
Run Code Online (Sandbox Code Playgroud)
其中 2 个特定的字符串参数正在文件中被检查,并且在出现 BOTH 参数 ($1 | $2) 的那些行中,如果之前没有 +,则会在该行的开头添加一个 +。
到目前为止尝试了不同的变体,最终要么检查两者,要么检查包含 2 个字符串中的 1 个或一些错误的每一行。感谢有关斜杠和反斜杠转义(分别是单引号/双引号)的任何说明,我想这就是我的问题所在。
编辑:希望的结果:(包含一堆文本文件的文件夹,其中一个有以下两行)
sudo bash MyScript.sh 01234567 Wanted
Run Code Online (Sandbox Code Playgroud)
前:
sed "/^[^+]/ s/\(.*$1|$2.*$\)/+\ \1/" -i file
Run Code Online (Sandbox Code Playgroud)
预期的:
sudo bash MyScript.sh 01234567 Wanted
Run Code Online (Sandbox Code Playgroud)
对于如下所示的输入文件:
$ cat infile
Some Random Text And A Number 01234567 and i'm Wanted.
Another Random Text with Diff Number 09812387 and i'm still Wanted.
Run Code Online (Sandbox Code Playgroud)
and 设置$1and $2to 01234567and Wanted(在脚本中,这些只是前两个位置参数,不必设置):
$ set -- 01234567 Wanted
Run Code Online (Sandbox Code Playgroud)
以下命令将起作用:
$ sed '/^+/b; /'"$1"'/!b; /'"$2"'/s/^/+ /' infile
+ Some Random Text And A Number 01234567 and i'm Wanted.
Another Random Text with Diff Number 09812387 and i'm still Wanted.
Run Code Online (Sandbox Code Playgroud)
这是它的工作原理:
$ set -- 01234567 Wanted
Run Code Online (Sandbox Code Playgroud)
b是“分支”命令;当单独使用时(与要跳转到的标签相反),它会跳过所有命令。
前两个命令跳过+以第一个参数开头或不包含第一个参数的行;如果我们在s命令行上,我们已经知道当前行不是以+第一个参数开头,而是包含第一个参数。如果它包含第二个参数,我们在前面加上+ 。
对于引用,除了包含参数的位置外,我对整个命令进行了单引号:
'single quoted'"$parameter"'single quoted'
Run Code Online (Sandbox Code Playgroud)
所以我不必逃避任何不寻常的事情。这假设双引号部分中的变量不包含任何可能混淆 sed 的元字符。
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |