String 猛击,修剪a";复杂的;字符串以获取新字符串

String 猛击,修剪a";复杂的;字符串以获取新字符串,string,bash,trim,String,Bash,Trim,我有一个txt文件包含许多字符串(每个字符串位于一行中)。典型的字符串具有以下形状: sno_Int-INT1_Exp-INT2_INT3.fits.fz_ovsc_rms_D4_D5_D6_D7_D8_D9 在上面的字符串中,“INT1”、“INT2”和“INT3”都是整数类型,对于文本文件中的每个字符串,它们的值可能不同,“D4-9”是双精度类型(也不是固定值) 我需要做的是将上述字符串更改为新字符串,如: INT3_ovsc_rms_D4_D5_D6_D7_D8_D9 有人能告诉我怎么

我有一个txt文件包含许多字符串(每个字符串位于一行中)。典型的字符串具有以下形状:

sno_Int-INT1_Exp-INT2_INT3.fits.fz_ovsc_rms_D4_D5_D6_D7_D8_D9
在上面的字符串中,“INT1”、“INT2”和“INT3”都是整数类型,对于文本文件中的每个字符串,它们的值可能不同,“D4-9”是双精度类型(也不是固定值)

我需要做的是将上述字符串更改为新字符串,如:

INT3_ovsc_rms_D4_D5_D6_D7_D8_D9
有人能告诉我怎么做吗


谢谢

如果您确实想在纯Bash中执行此操作,则需要通过设置IFS来拆分字符串,然后使用带有“here string”的
read
。有关详细信息,请参见此处:

您可能需要将其拆分多次--我想,一次是下划线,然后是破折号

#!/bin/bash

input=$1
left=${input%%.*}
right=${input#*.fz_}
int3=${left##*_}
output=${int3}_${right}

echo "${output}"


根据您的实际输入,这可能会严重中断。

如果您不介意awk:

echo sno_Int-INT1_Exp-INT2_INT3.fits.fz_ovsc_rms_D4_D5_D6_D7_D8_D9 | awk -F_ 'BEGIN{OFS="_"}{sub(/.fits.fz/,"",$4);print $4,$5,$6,$7,$8,$9,$10,$11,$12}'
INT3_ovsc_rms_D4_D5_D6_D7_D8_D9

此awk应能工作:

s='1000_1051.fits.fz_ovsc_rms_10.6_2.35_53.2_0_5.92_2.14'
awk -F'[_.]' 'NR==1{i3=$2;next} {printf "%s%s%s", i3, RS, $0}' RS='_ovsc_rms' <<< "$s"
1051_ovsc_rms_10.6_2.35_53.2_0_5.92_2.14
s='1000_1051.fits.fz_ovsc_rms_10.6_2.35_53.2_0_5.92_2.14'

awk-F'[\.]''NR==1{i3=$2;next}{printf“%s%s%s”,i3,RS,$0}'RS=''ovsc\rms'不使用Bash怎么样?Ruby、Python和Perl之间有什么偏好吗?@JohnZwinck,谢谢你的评论。目前,我更喜欢在BASH中做这件事,因为我正处于一个从BASH开始的项目的中间。String <代码> FZYOVSCYMRMs< /COD>固定?@ USERoutput@AdrianFrühwirth,
fz_ovsc_rms_
是固定的。“根据您的实际输入,这可能会严重中断”适用于野外看到的大多数Bash…@JohnZwinck同意这一点,但通过正确的错误处理,可以编写出地道且“漂亮”的Bash。这只是不经常发生…@JohnZwinck,非常感谢你的贡献!我喜欢你的解决方案,不仅解决了我的问题,而且你的代码对我来说非常直观。谢谢,你的代码很酷。但是,在我的机器上,我需要将
{i3=$2}
中的
$2
更改为
$4
,以获得与您相同的值(我期望如此)。否则,我在我的机器上得到的是:
Int-300\u ovsc\u rms\u 10.6\u 2.35\u 53.2\u 0\u 5.92\u 2.14
。嗨,马克,谢谢你的帖子。你的代码在我的机器上运行也很顺利。不幸的是,我已经向其他人发布了答案的绿色图标。。。再次感谢!
s='1000_1051.fits.fz_ovsc_rms_10.6_2.35_53.2_0_5.92_2.14'
awk -F'[_.]' 'NR==1{i3=$2;next} {printf "%s%s%s", i3, RS, $0}' RS='_ovsc_rms' <<< "$s"
1051_ovsc_rms_10.6_2.35_53.2_0_5.92_2.14