sed 查找和删除单个单词

Posted

技术标签:

【中文标题】sed 查找和删除单个单词【英文标题】:Sed find and delete single word 【发布时间】:2013-03-29 03:44:16 【问题描述】:

我想从.htaccess 文件中删除用户名。

例如.htaccess:

RewriteEngine On
RewriteBase /~usern/
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /~usern/index.php [L]

我想给我们一种动态命令,因为我不必每次都为每个用户手动输入/~username

我试过了

sed 's/$whoami##g' .htaccess

但这并没有达到预期的效果。

【问题讨论】:

Remove occurrences of string in text file、How to replace multiple patterns at once with sed?、How can I delete words from each line of a file using sed in shell script? 等可能重复 【参考方案1】:

你可以sed -i "s/$(whoami)//g" .htaccess

如果您只想删除一行中的第一个条目,请删除最后一个 g 选项。

sed -i (inline sed, do actions directly on file) "s/find_this/replace_with_this/" (search and replace)

如果您想搜索 ~/username 并删除它而不是仅删除用户名条目,只需将表达式更改为:

sed -i "s/~\/$(whoami)//g" .htaccess

【讨论】:

我们很接近了!如果我们试图删除 /~username 而不是 ~/username 就这么简单!由于您的原始命令只需要移动 \ 几个点,我终于得到了这个。非常感谢帮助! sed -i "s/\/~$(whoami)//g" .htaccess @NewBasher 啊,是的,对不起。 ~/ 是 *nix 进入主目录的方式,但在 url 中它是 ofc /~user。很高兴你解决了它:)【参考方案2】:

您正在 sed 中寻找 s

 sed 's#/~usern##g' file

用你的例子:

kent$  cat file
RewriteEngine On<br />
RewriteBase /~usern/<br />
RewriteRule ^index\.php$ - [L]<br />
RewriteCond %REQUEST_FILENAME !-f<br />
RewriteCond %REQUEST_FILENAME !-d<br />
RewriteRule . /~usern/index.php [L]<br />

kent$  sed 's#/~usern##g' file
RewriteEngine On<br />
RewriteBase /<br />
RewriteRule ^index\.php$ - [L]<br />
RewriteCond %REQUEST_FILENAME !-f<br />
RewriteCond %REQUEST_FILENAME !-d<br />
RewriteRule . /index.php [L]<br />

【讨论】:

感谢您的快速回复!在我发布问题后,我想到了一些可以加快进程的方法,如何在其中添加“whoami”来搜索我的帐户用户名,而不是手动输入 ~username 你的意思是sed "s#/$USER##" file?更好地更新你的问题。 感谢更新了大多数问题,$USER 也没有为我工作 正如@Kent 所说:鞭打\\ 的方法就在那里! sed "s#/$(whoami)##" 一定能正常工作!【参考方案3】:

不要丢弃旧版本,为什么不将它们存储为评论:

当我对配置文件进行一些修改时,我喜欢做很多备份,以便在出现问题时能够获取旧配置。

因此,比起替换,我更喜欢制作旧行的注释副本(并确保只修改未注释的所需行):

sed -re "s/^(\s*Rewrite.*)\/~$(whoami)(.*$)/# &\n\1\2/" -i.bak .htaccess

diff -u .htaccess.bak, 会产生:

--- .htaccess.bak   2013-09-07 18:44:07.043537404 +0200
+++ .htaccess       2013-09-07 18:46:35.236454686 +0200
@@ -1,6 +1,8 @@
 RewriteEngine On<br />
-RewriteBase /~usern/<br />
+# RewriteBase /~usern/<br />
+RewriteBase /<br />
 RewriteRule ^index\.php$ - [L]<br />
 RewriteCond %REQUEST_FILENAME !-f<br />
 RewriteCond %REQUEST_FILENAME !-d<br />
-RewriteRule . /~usern/index.php [L]<br />
+# RewriteRule . /~usern/index.php [L]<br />
+RewriteRule . /index.php [L]<br />

说明:

找到包含Rewrite.*usern 的行。将此行替换为注释标记 (#),然后是整行,而不是 newline 和没有 usern 的同一行

因为\s*括号中,任何类型的缩进都会在输出中重现。

sed 使用开关-i.bak 运行时,未修改的旧版本文件将存储为.htaccess.bak(这可能有点冗余,语法/# &amp;\n...复制并注释未修改的旧行)。

仅供参考,供您选择:

编辑时备份旧文件 编辑时备份旧行 编辑时备份行和文件 什么都不备份,因为您已经拥有强大而高效的备份解决方案。

【讨论】:

以上是关于sed 查找和删除单个单词的主要内容,如果未能解决你的问题,请参考以下文章

linux中sed命令删除单词

Sed:以/etc/passwd文件为模板

使用 sed 删除两个单词之间的数据

如何在 shell 脚本中使用 sed 从文件的每一行中删除单词? [复制]

查找列表中所有与单个字母不同的单词

grep 访问多行,查找两个模式之间的所有单词