Bash Sed查找并删除单个单词

Bash Sed查找并删除单个单词,bash,sed,Bash,Sed,我想从.htaccess文件中删除用户名 示例.htaccess: RewriteEngine On RewriteBase /~usern/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /~usern/index.php [L] 我想给我们提供一种动态命令,不必每次为每个用户手动键入/~username

我想从
.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

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

您正在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 />
kent$cat文件
重新启动引擎
RewriteBase/~usern/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-f
重写cond%{REQUEST_FILENAME}-d
重写规则/~usern/index.php[L]
kent$sed的#/~usern##g'文件 重新启动引擎
重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-f
重写cond%{REQUEST_FILENAME}-d
重写规则/index.php[L]

您正在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 />
kent$cat文件
重新启动引擎
RewriteBase/~usern/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-f
重写cond%{REQUEST_FILENAME}-d
重写规则/~usern/index.php[L]
kent$sed的#/~usern##g'文件 重新启动引擎
重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-f
重写cond%{REQUEST_FILENAME}-d
重写规则/index.php[L]
您可以
sed-i“s//$(whoami)//g.htaccess

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

sed-i(内联sed,直接在文件上执行操作)“s/find_this/replace_with_this/”(搜索并替换)

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

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

您可以
sed-i“s/$(whoami)//g.htaccess

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

sed-i(内联sed,直接在文件上执行操作)“s/find_this/replace_with_this/”(搜索并替换)

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

sed-i“s/~\/$(whoami)//g”.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 />
--.htaccess.bak 2013-09-07 18:44:07.043537404+0200
+++.htaccess 2013-09-07 18:46:35.236454686+0200
@@ -1,6 +1,8 @@
重新启动引擎
-RewriteBase/~usern/
+#RewriteBase/~usern/
+重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-f
重写cond%{REQUEST_FILENAME}-d
-重写规则/~usern/index.php[L]
+#重写规则/~usern/index.php[L]
+重写规则/index.php[L]
说明: 查找包含
Rewrite.*usern
的行。将此行替换为注释标记(
#
),然后是整行,而不是
换行符
和不带
usern的同一行

由于括号中的
\s*
,因此任何类型的缩进都将在输出时再现

当使用开关
-i.bak
运行
sed
时,较旧的未修改版本的文件将存储为
.htaccess.bak
(这可能与将复制和注释未修改的旧行的syntax
/\n..
有点冗余)

仅用于样品,因此您可以选择:

  • 编辑时备份旧文件
  • 编辑时备份旧行
  • 编辑时备份行和文件
  • 无需备份,因为您已经有了一个强大而高效的备份解决方案
与其删除旧版本,为什么不将其存储为注释: 当我对配置文件进行一些修改时,我喜欢做大量备份,以便在出现错误时能够获得较旧的配置

因此,与其替换,我更喜欢创建一个旧行的注释副本(并确保只修改未注释的所需行):

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 />
--.htaccess.bak 2013-09-07 18:44:07.043537404+0200
+++.htaccess 2013-09-07 18:46:35.236454686+0200
@@ -1,6 +1,8 @@
重新启动引擎
-RewriteBase/~usern/
+#RewriteBase/~usern/
+重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-f
重写cond%{REQUEST_FILENAME}-d
-重写规则/~usern/index.php[L]
+#重写规则/~usern/index.php[L]
+重写规则/index.php[L]
说明: 查找包含
Rewrite.*usern
的行。将此行替换为注释标记(
#
),然后是整行,而不是
换行符
和不带
usern的同一行

由于括号中的
\s*
,因此任何类型的缩进都将在输出时再现

当使用开关
-i.bak
运行
sed
时,较旧的未修改版本的文件将存储为
.htaccess.bak
(这可能与将复制和注释未修改的旧行的syntax
/\n..
有点冗余)

仅用于样品,因此您可以选择:

  • 编辑时备份旧文件
  • 编辑时备份旧行
  • 编辑时备份行和文件
  • 无需备份,因为您已经拥有强大而高效的