我有一个文件,其中包含一行用户名,后跟其他信息。
例如文件包含:
Clara01{25 个信息字符}Betty29{25 个信息字符}Edith34{25 个信息字符}Raji11{25 个信息字符}
所有内容都在一个很长的行中,包含许多用户名,后跟 25 个字符的信息。
现在,我想搜索Betty29,然后删除/删除子字符串Betty29{25个字符的信息}。 也就是说,我应该如何删除 Betty29 以及接下来的 25 个字符。 我应该如何在 Linux shell 脚本中做到这一点?
我已经阅读了有关 sed 命令的内容,但我仍然无法弄清楚。我是 shell 脚本新手,所以请多多指教。
readarray -d'}'
以数组形式访问文件。Betty29
和 unset
开头的元素。printf '%s'
整个 "${array[@]}"
作为输出。unset_element() {
local -r prefix="$1"
local -a array
local -i idx
readarray -d'}' array
unset 'array[-1]' # empty
for idx in "${!array[@]}"; do
[[ "${array[idx]}" = "${prefix}{"* ]] && unset 'array[idx]' || :
done
printf '%s' "${array[@]}"
}
现在让我们测试一下:
input='Clara01{25 characters of info}'
input+='Betty29{25 characters of info}'
input+='Edith34{25 characters of info}'
input+='Raji11{25 characters of info}'
unset_element 'Betty29' <<< "$input"
输出:
Clara01{25 characters of info}Edith34{25 characters of info}Raji11{25 characters of info}
大概,这会删除Betty29
的
所有出现。如果您只想删除 first 并使其“更高效”,只需在找到匹配项后将
break
添加到 for
循环中即可。
正如@Shawn建议的那样
sed 's/Betty29.\{25\}//' foo.txt
正在完成工作。
谢谢大家的帮助!
如果我也可以在 bash 中轻松创建子进程(
sed
或其他),我就不会创建它。
说我们有
line=abcBetty29abcdefghijklmnopqrstuvwxyz
那么我们可以做
new_line=${line/Betty29?????????????????????????//}
由于计算 25 个问号很容易出错,因此另一种方法是使用正则表达式:
if [[ $line =~ ^(.*)Betty29.{25}(.*) ]]
then
new_line=${BASH_REMATCH[1]}${BASH_REMATCH[2]}
else
echo pattern not found 1>&2
fi