Regex Linux sed命令不会更改目标文件

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/

使用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[:空白:<$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