Bash 从匹配模式的外壳词中剥离前缀和后缀

Bash 从匹配模式的外壳词中剥离前缀和后缀,bash,shell,Bash,Shell,我正在读一行输入,其中将包含许多以开头的单词,这些单词被标记化了,并且有一个以开头的后缀:TKN\ukn;我的目标是去掉这些前缀和后缀 我尝试过awk-v RS=“”-F'[\u:]['{print$3}',但如果名称本身包含下划线,则此操作无效 输入示例: is_tokenized_Firstname:TKN_NAME is_tokenized_Last_Name:TKN_NAME 预期产出: Firstname Last_Name 这是因为使用=~操作符进行正则表达式匹配将BASH\u

我正在读一行输入,其中将包含许多以
开头的单词,这些单词被标记化了,并且有一个以
开头的后缀:TKN\ukn
;我的目标是去掉这些前缀和后缀

我尝试过
awk-v RS=“”-F'[\u:]['{print$3}'
,但如果名称本身包含下划线,则此操作无效


输入示例:

is_tokenized_Firstname:TKN_NAME is_tokenized_Last_Name:TKN_NAME
预期产出:

Firstname Last_Name
这是因为使用
=~
操作符进行正则表达式匹配将
BASH\u REMATCH
变量设置为一个数组,其中第二个项(在索引1处,索引0之后)是当前正则表达式中的第一个匹配组。

使用
sed
输出 使用
awk
  • FS
    是用于拆分输入字符串的正则表达式
  • OFS
是输出分隔符的字符串 输出
预计是在第二行,sry fr的打字错误!首先,包括对所需逻辑的英语描述,而不是单独的示例。第二,我们希望你们在这里展示自己的努力。你试过什么,怎么会失败?一些你没有回答的相关问题的例子:你想去掉的唯一前缀是标记化的吗?唯一后缀是:TKN\u NAME?使用其他前缀或其他后缀的内容会发生什么情况?内容是来自流还是在shell变量中?我们在谈论多少内容?(短流在shell中本地处理更有效,使用外部工具处理更长的序列)。还有,具体是哪个外壳?答案是否需要符合POSIX sh,或者ksh或bash功能是否可以接受?@sampatkumar:这些都应该进入问题(你应该这样做)。@CharlesDuffy oh right
sed-e's/is_标记化//g'-e's/:TKN\u NAME//g'/tmp/so.txt
给出相同的结果!是的!经修正后好多了。仍然不太符合规范,因为它应该删除任何以
:TKN_
开头的后缀,而不仅仅是
:TKN_NAME
,而且可以说,通过删除任何位置的字符串,而不仅仅是在前缀和后缀位置,它超出了指定的行为,但这肯定解决了效率问题。感谢您的回复,但是wrt to AWK打印值是恒定的,但是有没有一种方法可以通过引入循环来获得通用性。与处理输入时一样,输入也可能有2组或多组相同的模式。正如在给定的例子中,我只给出了2组,但它可能会有所不同,因为它可以有2组,或3或4组取决于。我尝试与下面的家伙解决了我的一般问题,感谢每一个人的提示和帮助。Cheers awk'BEGIN{FS=“(is_tokenized_124;:TKN_NAME|”)“OFS=“”;{for(i=1;i
s='is_tokenized_Firstname:TKN_NAME is_tokenized_Last_Name:TKN_NAME'
read -r -a words_in <<<"$s"                    # Read words into array
for word in "${words_in[@]}"; do               # Iterate over input
  [[ $word = is_tokenized_*:TKN* ]] && {       # Check for match
    word=${word#is_tokenized_}                 # Strip prefixes
    word=${word%:TKN*}                         # Strip suffixes
  }
  printf '%s ' "$word"                         # Write output
done
printf '\n'
re='^is_tokenized_([^:]+):TKN_'
s='is_tokenized_Firstname:TKN_NAME is_tokenized_Last_Name:TKN_NAME'
read -r -a words_in <<<"$s"
for word in "${words_in[@]}"; do
  [[ $word =~ $re ]] && word=${BASH_REMATCH[1]}
  printf '%s ' "$word"
done
printf '\n'
sed -e 's/is_tokenized_//g' -e 's/:TKN_NAME//g' /tmp/data.txt
Firstname Last_Name
Firstname Last_Name
awk 'BEGIN{ FS="(is_tokenized_|:TKN_NAME)"; OFS=" " } ; {print $2, $4}' /tmp/data.txt
Firstname Last_Name
Firstname Last_Name