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

eoigrqb6  于 2023-08-03  发布在  Linux
关注(0)|答案(3)|浏览(117)

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

例如文件包含:

Clara 01 {25个信息字符} Betty 29 {25个信息字符} Edith 34 {25个信息字符} Raji 11 {25个信息字符}
所有这些都在一个非常长的行中,有许多用户名,后面跟着25个字符的信息。
现在,我想搜索Betty 29,然后删除/移除子字符串Betty 29 {25个信息字符}。也就是说,我应该如何删除Betty 29,然后接下来的25个字符。我应该如何在Linux shell脚本中做到这一点?
我读过sed命令,但我仍然无法弄清楚。我是shell脚本的新手,所以请善待我。

cpjpxq1n

cpjpxq1n1#

正如@Shawn所建议的

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

字符串
就是完成任务
谢谢大家的帮助!

zbwhf8kr

zbwhf8kr2#

1.使用readarray -d'}'以数组形式访问文件。
1.搜索以Betty29unset开头的元素。
1.然后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的所有次。如果你只想删除第一个**并使其“更高效”,只要在找到匹配项后向for-循环中添加一个break即可。

gj3fmq9x

gj3fmq9x3#

我不会创建一个子进程(sed或其他),如果我也可以在bash中轻松完成的话。
假设我们有

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

相关问题