sed 替换未知字符串的位置匹配除以用户定义的分隔符
sed replace positional match of unknown string divided by user-defined separator
当位于第 3 层且分隔符为 /
时,想要从字符串重命名(未知)文件路径中的(已知)第 3 个文件夹
sed
明确需要一行代码。因为我以后想用它来 tar --transform=EXPRESSION
string="/db/foo/db/bar/db/folder"
echo "$string" | sed 's,db,databases,'
sed 仅在第 3 级替换“db”
预期结果
/db/foo/databases/bar/db/folder
您可以使用捕获组来捕获 /db/foo/
,然后匹配 db
。然后使用 </code>:</p> 在替换中使用第一个 caputring 组
<pre><code>string="/db/foo/db/bar/db/folder"
echo -e "$string" | sed 's,^\(/[^/]*/[^/]*/\)db,databases,'
关于图案
^
字符串开头
\(
开始捕获组
/[^/]*/[^/]*/
使用否定字符匹配前两部分 class
\)
关闭捕获组
db
字面匹配
那会给你
/db/foo/databases/bar/db/folder
如果 awk 也是此任务的一个选项:
$ awk 'BEGIN{FS=OFS="/"} =="db"{="database"} 1' <<<'/db/foo/db/bar/db/folder'
/db/foo/database/bar/db/folder
FS = OFS = "/"
将 /
分配给输入和输出字段分隔符,
== "db" { = "database }"
如果第四个字段是 db
,则设为 database
,
1
打印记录。
这是一种纯粹的 bash 方法,通过设置 IFS=/
而不调用任何外部实用程序来完成此操作:
string="/db/foo/db/bar/db/folder"
string=$(IFS=/; read -a arr <<< "$string"; arr[3]='databases'; echo "${arr[*]}")
echo "$string"
/db/foo/databases/bar/db/folder
当位于第 3 层且分隔符为 /
sed
明确需要一行代码。因为我以后想用它来 tar --transform=EXPRESSION
string="/db/foo/db/bar/db/folder"
echo "$string" | sed 's,db,databases,'
sed 仅在第 3 级替换“db”
预期结果
/db/foo/databases/bar/db/folder
您可以使用捕获组来捕获 /db/foo/
,然后匹配 db
。然后使用 </code>:</p> 在替换中使用第一个 caputring 组
<pre><code>string="/db/foo/db/bar/db/folder"
echo -e "$string" | sed 's,^\(/[^/]*/[^/]*/\)db,databases,'
关于图案
^
字符串开头\(
开始捕获组/[^/]*/[^/]*/
使用否定字符匹配前两部分 class
\)
关闭捕获组db
字面匹配
那会给你
/db/foo/databases/bar/db/folder
如果 awk 也是此任务的一个选项:
$ awk 'BEGIN{FS=OFS="/"} =="db"{="database"} 1' <<<'/db/foo/db/bar/db/folder'
/db/foo/database/bar/db/folder
FS = OFS = "/"
将/
分配给输入和输出字段分隔符,== "db" { = "database }"
如果第四个字段是db
,则设为database
,1
打印记录。
这是一种纯粹的 bash 方法,通过设置 IFS=/
而不调用任何外部实用程序来完成此操作:
string="/db/foo/db/bar/db/folder"
string=$(IFS=/; read -a arr <<< "$string"; arr[3]='databases'; echo "${arr[*]}")
echo "$string"
/db/foo/databases/bar/db/folder