regex - 用sed替换超过150000个字符

标签 regex bash shell sed grep

我想用 sed
替换这个 LONG 字符串 我从 grep 得到了字符串,我将它存储到变量 var
这是我的 grep 命令和我的 var 变量:

var=$(grep -P -o "[^:]//.{0,}" /home/lazuardi/project/assets/static/admin/bootstrap3/css/bootstrap.css.map | grep -P -o "//.{0,})  

这是 grep 的输出:string

然后我尝试用sed命令替换它

sed -i "s|$var||g" /home/lazuardi/project/assets/static/admin/bootstrap3/css/bootstrap.css.map

但它给我输出 bash:/bin/sed: Argument list too long

如何替换它?

注意:该字符串一行有 183544 个字符。

最佳答案

实际上想在这里完成什么? sed 是面向行的,因此您不能替换多行字符串(即使您用 \n 替换文字换行符也不能......嗯,有很多方法可以编写一个 sed 脚本,它可以有效地替换一系列行,但它很快就会被折磨)。

bash$ var=$(head -n 2 /etc/mtab)

bash$ sed "s|$var||" /etc/mtab
sed: -e expression #1, char 25: unterminated `s' command

bash$ sed "s|${var//$'\n'/\\n}||" /etc/mtab | diff -u /etc/mtab -

bash$ # (didn't replace anything, so no output)

作为解决方法,您可能想要的可以通过将 $var 中的换行符替换为 \|(或者可能只是 |,取决于你的 sed 方言)与上面演示的类似,但你仍然会遇到 ARG_MAX 限制并且有一堆其他讨厌的皱纹需要解决,所以我们不要去那里。

但是,sed 本身可以出色地完成您的尝试,全部靠它自己。您不需要字符串列表;毕竟,sed 也可以处理正则表达式(而且您使用的正则表达式实际上不需要 Perl 扩展,因此 -P 选项基本上是多余的)。

sed -i 's%\([^:]\)//.*%\1%' file

有一个小警告——如果前面有和没有 : 的字符串出现,您的原始命令将全部替换它们(如果它有效的话),而这个将仅替换前面没有冒号的事件。这意味着行首的注释不会被触及——如果你也想删除它们,只需添加一个行 anchor 作为替代; sed -i 's%\(^\|[^:]\)//.*%\1%' 文件

如果您出于其他原因需要 var 中的注释,grep 也可以得到显着清理。 (显然,您会在执行替换之前运行它。)

var=$(grep -P -o '[^:]\K//.*' file)

(\K 扩展名是真正需要 -P 的扩展名。当然,还有通用的、清晰的、标准的、可读的、可移植的、明显的、简单的方法来写 {0,}*。)

关于regex - 用sed替换超过150000个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270529/

相关文章:

仅用于数字的 Javascript 正则表达式接受 # $ % & (

python - 如何检查 python 字符串以查看它是否在 HH :MM time format? 中

php - 在 PHP 中使用 preg_match 通过多个分隔符拆分字符串

python - 尽管安装了 Anaconda,Mac 仍使用默认 Python

bash - nmcli con up 命令似乎在给它一个来自变量的连接名称时添加了一个尾随句点

linux - 如何在/dev/fd下添加新的文件描述符?

jquery 选择器字符和数字正则表达式

bash - .bashrc 在 WSL 上的位置是什么?

bash - 让 shell 提示等待所有进程完成

bash - shell $@ 变量赋值和迭代