如何用固定字符串替换部分路径?

问题描述 投票:-2回答:5

我想从一行中的路径字符串稍微改变目录名称。 例如,如果给定字符串是 './dir1/dir2/dir3/xxx.txt'

我想要 './dir1/fix_string_as_suffix'

我想将它与下面的find命令结合使用,虽然还没有修复。

find . -type d \( -name 'vendor' \) -prune -o -type f -name '*.txt' -print | cut -d'/' -f1,2
string shell replace path
5个回答
1
投票

你可以使用sed

s='./dir1/dir2/dir3/xxx.txt'
sed -E 's~^(([^/]*/){2}).*~\1~' <<< "$s"

./dir1/

1
投票

使用IFS和printf内置

根据您是否要使用cut,sed或awk之类的标准实用程序,或者您希望将自己限制在shell本身内部的扩展和内置,可以有多种方法在shell中执行您想要的操作。一种方法是将路径拆分为组件,然后使用printf命令或内置组件重新加入它们。例如:

path='./dir1/dir2/dir3/xxx.txt'

IFS='/' read -ra dirs <<< "$path"
printf '%s' "${dirs[0]}/" "${dirs[1]}/" "..." $'\n'

如果要将其转换为单行,请使用分号和/或使用curly braces for command grouping连接命令。但是,可读性胜过简洁,特别是在shell编程中。


0
投票

使用cut命令:

#!/bin/bash

path="./dir1/dir2/dir3/xxx.txt"
suffix="something fixed string"
prefix=`echo $path | cut -d/ -f1,2`
echo "$prefix/$suffix"

使用;连接上面的行以使其在一行上:

prefix=`echo $path | cut -d/ -f1,2` ; echo "$prefix/$suffix"

0
投票

我认为这就是你要找的东西

find . -type d \( -name 'vendor' \) -prune -o -type f -name '*.txt' -exec sh -c 'echo "${1%/*}/fix_string_as_suffix"' fstrasuff {} \;

0
投票

实际上,我最终如下。

find . -type d \( -name 'vendor' \) -prune -o -type f -name '*.txt' -print | cut -d'/' -f1,2 | uniq | awk '{print $1"/..."}'
© www.soinside.com 2019 - 2024. All rights reserved.