![](/img/trans.png)
[英]How can I use a regex variable for a find and replace command in bash?
[英]How can I pipe a bash variable into a GREP regex in the following command?
我有一個可以正常運行的命令,如下所示:
grep ",162$" xyz.txt | grep -v "^162,162$"
它基本上是在尋找具有“ number,162”之類的模式的行,但數字為162的行除外。
現在,我想運行許多這樣的命令,其中162被其他數字代替
grep ",$159" xyz.txt | grep -v "^159,159$"
grep ",$111" xyz.txt | grep -v "^111,111$"
..等等,相同的數字出現在命令的每個部分中。 因此,我需要一個地方來更改值,命令的其余部分可以在需要的地方使用該值。
我想做這樣的事情來重復我想嘗試另一個號碼時需要做的更改次數
x=162 | grep ",\$x$" xyz.txt | grep -v "^\$x,\$x$"
但這不起作用。 我應該做些什么更改,以便每次必須更改數字值時,我都只轉到命令的第一個位置並僅更改x的值?
每當將grep傳遞到grep時,請考慮使用awk:
var=YOUR_NUM
awk -F, -v pat="$var" '$NF==pat && $1!=pat' file
這與awk
的字段有點用:通過將字段分隔符設置為逗號,然后可以分別處理每個部分。
您要匹配最后一個字段是給定值而第一個字段不是給定值的情況。 可以在最后一個字段中使用$NF
,在第一個字段中使用$1
。
另外,您可以通過檢查NF
(字段數)並將條件設置為!($1==pat && NF==2) && $NF==pat
這樣的方式來添加額外的控制層,以便像162,162,162
這樣的行被打印。 但這確實取決於您要執行的操作。
例如:
$ cat file
hello
hello,162
162,162
$ val=162
$ awk -F, -v pat="$val" '$NF==pat && $1!=pat' file
hello,162
然后,只需將$var
更改$var
所需的值即可。
如果我對它的理解正確,則您需要以下內容:
x=162
grep ",$x\$" xyz.txt | grep -v "^$x,$x\$"
如果您打算單線報價,那就是您的朋友:
X=123 /bin/sh -c 'grep ","$X"$" xyz.txt | grep -v "^"$X","$X"$"'
單個grep
命令可以與否定性后面使用:
$ cat xyz.txt
12,12
112,12
1,12
42,12
$ grep -P '(?<!^12),12$' xyz.txt
112,12
1,12
42,12
傳遞變量很棘手
$ x=12
$ grep -P "(?<!"^$x"),"$x"$" xyz.txt
112,12
1,12
42,12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.