我想用 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/