Linux 中如何从文件中的字符串中删除从给定子字符串开始直到接下来的 n 个字符的字符?

问题描述 投票:0回答:3

我有一个文件,其中包含一行用户名,后跟其他信息。

例如文件包含:

Clara01{25 个信息字符}Betty29{25 个信息字符}Edith34{25 个信息字符}Raji11{25 个信息字符}

所有内容都在一个很长的行中,包含许多用户名,后跟 25 个字符的信息。

现在,我想搜索Betty29,然后删除/删除子字符串Betty29{25个字符的信息}。 也就是说,我应该如何删除 Betty29 以及接下来的 25 个字符。 我应该如何在 Linux shell 脚本中做到这一点?

我已经阅读了有关 sed 命令的内容,但我仍然无法弄清楚。我是 shell 脚本新手,所以请多多指教。

linux bash shell unix vi
3个回答
0
投票
  1. 使用
    readarray -d'}'
    以数组形式访问文件。
  2. 搜索以
    Betty29
    unset
    开头的元素。
  3. 然后
    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
循环中即可。


0
投票

正如@Shawn建议的那样

sed 's/Betty29.\{25\}//' foo.txt 

正在完成工作。

谢谢大家的帮助!


0
投票

如果我也可以在 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
© www.soinside.com 2019 - 2024. All rights reserved.