Regex Linux sed命令不会更改目标文件
使用shell脚本,当我运行Regex Linux sed命令不会更改目标文件,regex,linux,sed,Regex,Linux,Sed,使用shell脚本,当我运行/Test1 hello result时 它应该将hello作为标准输入,并将结果作为标准输出。shell应该删除、和abc之前的所有空格 所以,我这样写剧本 tr -d [:blank:] < $1 grep -r "<td>" $1 | sed -r 's/<td>//g' > $2 sed -r 's/<\/td>//g' $2 sed -r 's/abc//g' $2 tr-d[:空白:2美元 sed-r's/
/Test1 hello result
时
它应该将hello
作为标准输入,并将结果作为标准输出。shell应该删除
、
和abc
之前的所有空格
所以,我这样写剧本
tr -d [:blank:] < $1
grep -r "<td>" $1 | sed -r 's/<td>//g' > $2
sed -r 's/<\/td>//g' $2
sed -r 's/abc//g' $2
tr-d[:空白:<$1
grep-r“$1 | sed-r's///g'>2美元
sed-r's///g'$2
sed-r’s/abc//g’$2
但是,当我运行此命令时,结果文件的内容与hello文件的内容完全相同(唯一的区别是删除了空格)
文件内容:
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>abc</td>
<td>abc</td>
你好
你好
你好
abc
abc
如何获取
sed
以将更改应用于目标文件?如果希望sed
就地编辑现有文件,应为其提供-I
选项
UPD:还不清楚您想对
tr
的结果做什么(现在它转到脚本的标准输出,是不是有意的?如果您想让sed修改文件,您需要传递-e如果您想将更改从sed
存储回文件,请使用-i
选项:
$ cat file
<head>abc</head>
<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>abc</td>
<td>abc</td>
<h1>abc</h1>
$ sed -ni '/<td>/{s/^\s*//;s/abc//;s/<\/\?td>//g;p}' file
$ cat file
hello
hello
hello
?
使前一个字符成为可选字符,因此/
不必存在,从而使regexp与
匹配 grep解决方案:
kent$ echo "<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>abc</td>
<td>abc</td>"|grep -v 'abc'|grep -oP '(?<=<td>).*(?=</td>)'
hello
hello
hello
kent$ echo "<td>hello</td>
<td>hello</td>
<td>hello</td>
<td>abc</td>
<td>abc</td>"|awk -F"</?td>" '!/abc/{print $2}'
hello
hello
hello
kent$echo“你好
你好
你好
abc
abc“| grep-v'abc'| grep-oP'(?您只需要一个简单的sed或awk替换行:
sed -r 's/[[:blank:]]|<\/?td>|abc//g' file
awk '{gsub(/[[:blank:]]|<\/?td>|abc/,"")}1' file
sed-r的/[:blank:]| | abc//g'文件
awk'{gsub(/[:blank:]| | abc/,“”)}1'文件
e、 g:
$cat文件
你好
你好
你好
abc
abc
$sed-r的/[:blank:]| | abc//g'文件
你好
你好
你好
在sed命令中使用-i选项更改文件本身,如果不更改,则在屏幕上打印输出,但文件保持不变
公式是:
sed -i <targetFile> 's/<beforeText>/<afterText>/g' <targetFile>
另一个选项-输出到另一个文件并重命名:
sed 's/secretPassword/xxx/g' myCredentials.txt > temp.txt
rm myCredentials.txt && mv temp.txt myCredentials.txt
有关更多信息,请参阅文档:
sed实用程序读取指定的文件,如果没有,则读取标准输入
文件被指定,修改com列表指定的输入-
mands。然后将输入写入标准输出。
可以将单个命令指定为sed.Multiple的第一个参数
可以使用-e或-f选项指定命令。所有命令
以指定的顺序应用于输入,而不考虑
它们的起源
-i就地编辑文件,以指定的扩展名保存备份。
如果提供零长度扩展名,则不会保存备份。它
不建议在就位时提供零长度延长
编辑文件,因为您可能会在原地损坏或部分内容-
磁盘空间耗尽的情况等
那么,你的意思是我应该这样做:tr-d[:blank:<$1>$2---------->删除$1中的所有空白,并将结果放入$2吗?还有,sed-I'..'是的,但请看@sudo\u O的答案,以获得彻底改进的解决方案(所有操作都在sed中完成)。顺便说一句,\/\?
代表“可选斜杠”,也就是说,要么/
,要么什么都不匹配,以同时匹配
和
。这是什么?它不同于吗?此外,我使用grep,因为hello是一个html文件,所以有etc,所以,我想找到文件中包含的行,删除,并将其放入$2文件中。对于混淆,也请参阅编辑以仅匹配li包含
的nes取代了对grep
的需求。那么,你是说我必须手动删除它?也使用sed?起初,我使用grep,因为它将跳转到只包含的行,并将其放入输出文件中。(所以,它不会写到输出文件。@ USSR8885AH,你现在的意思更清楚了,看看新的编辑,如果有帮助的话,考虑接受这个答案。你通过了<代码> -E <代码>的命令,以便在适当的地方编辑?(答案是“没有问题中提到的”,可悲的是!)grep
命令接受-e
,但它指定了要搜索的正则表达式。sed
命令接受-e
,但它指定了脚本的(片段)。
sed -i <targetFile> 's/<beforeText>/<afterText>/g' <targetFile>
sed -i myCredentials.txt 's/secretPassword/xxx/g' myCredentials.txt
sed 's/secretPassword/xxx/g' myCredentials.txt > temp.txt
rm myCredentials.txt && mv temp.txt myCredentials.txt