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
(这可能有点冗余,语法/# &\n...
复制并注释未修改的旧行)。
仅供参考,供您选择:
编辑时备份旧文件 编辑时备份旧行 编辑时备份行和文件 什么都不备份,因为您已经拥有强大而高效的备份解决方案。【讨论】:
以上是关于sed 查找和删除单个单词的主要内容,如果未能解决你的问题,请参考以下文章