我正在尝试找到一个正则表达式,如果特定字符串匹配,我将删除文件的整个内容。
例如,我的文件内容是:
This is the first line
Here is password=SECRET second line
Here is third line
我正在搜索带有模式密码=的字符串,当匹配发生时,应该从上面的文件中删除所有行。
下面的命令会删除与模式匹配的整行,但我无法找出用于删除整个内容的正则表达式:
cat test.txt | sed 's|^.*password=.*||'
我理解sed是逐行工作的,除非我在sed中使用其他选项,否则我可能无法删除整个内容。
我只对正则表达式感兴趣的原因是我正在使用另一个工具,它使用正则表达式作为输入来执行转换。我在这里使用 sed 作为示例来说明我到目前为止所理解的内容。
答案 0 :(得分:0)
答案 1 :(得分:0)
您使用的工具的文档是乏味的,我无法找到是否有办法指定与正则表达式本身分离的正则表达式标记。
如果您找到这种方式,则应指定Pattern.DOTALL
的使用,这将使.
匹配换行符。
如果你没有,你可以使用简写(?s)
从正则表达式模式中指定使用DOTALL模式,这将适用于模式的其余部分:
(?s)^.*password=.*"
我tested it on ideone,随时修改代码以确保它适合您。
您无法使用sed
对此进行测试;通过在模式空间中加载整个文件(这本身就是一个坏主意)可以避免逐行问题,但是(GNU?)sed
只接受BRE和ERE正则表达式,而不是实现DOTALL标志。
要在单个文件regex101 will do上测试它,要在整个git repo上测试它,我只需克隆它并运行目标工具而不是替换命令。
答案 2 :(得分:0)
您可以使用众所周知的1h;2,$H;$!d;g
结构(对于非常大的文件,请谨慎!)将文件中的所有文本读入内存,然后运行简单的.*<YOUR_PATTERN>.*
替换命令中的模式:
sed -e '1h;2,$H;$!d;g' -e 's/.*password=.*//' file > tmp && mv tmp file
或者,您可以逐行阅读并追加一行,直到它与您的模式匹配为止,然后删除模式空间内的文本,然后使用以下命令逐行删除其余各行:
sed ':a;N;/password=/!ba;d{:b;N;d;bb}' file > tmp && mv tmp file
请参见sed
online demo:
res="Result: '$(sed -e '1h;2,$H;$!d;g' -e 's/.*password=.*//' <<< "$s")'"
echo "$res"
# => Result: ''
res3="Result: '$(sed ':a;N;/password=/!ba;d{:b;N;d;bb}' <<< "$s")'"
echo "$res3"
# => Result: ''
答案 3 :(得分:0)
这被标记为“ sed”,但从表面上看,sed
不是完成此任务的正确工具。 grep ad bash将使任务更加简单。根据OP,要求是用regexp表示条件,而grep会这样做。
使用grep,无需扫描完整的文件等。对于单个文件
grep -q 'password=' $file && true > $file
对于多个文件
for file in $(grep -l 'password=' *.txt) ; do
true > $file
done
构造'true> file'会将'file'截断为0个字节,与cp /dev/null file
相同,但是通常将在shell内部进行解析,而无需进行其他分叉过程。