无法理解 Perl 正则表达式替换行为

Can't understand Perl regex replace behavour

我有一些文本是从另一个命令通过管道传输的,如下所示:

source:project_dbt.common.business_days
source:project_dbt.common.cms_compare
source:project_dbt.common.cms_provider_national
source:project_dbt.common.gov_cms_data_Medicare-Claims_Reassignment-Sub-File_rta9-bts3
source:project_dbt.common.gov_cms_data_Medicare-Enrollment_Address-Sub-File_je57-c47h
source:project_dbt.common.gov_cms_data_Medicare-Enrollment_Base-Provider-Enrollment-File_ykfi-ffzq
source:project_dbt.common.gov_cms_data_Medicare-Enrollment_Secondary-Specialty_n48j-8qtj
source:project_dbt.common.gov_cms_data_Medicare-Part-D_Medicare-Provider-Utilization-and-Payment-Data-Par_icvy-hptt
source:project_dbt.common.gov_cms_data_Medicare-Physician-Supplier_Medicare-Physician-and-Other-Supplier-National-Pro_5fr6-cch3
source:project_dbt.common.gov_cms_data_provider-data_dataset_mj5m-pzi6_National_Downloadable_File
source:project_dbt.common.gov_cms_download_nppes_NPPES_Data_Dissemination
source:project_dbt.common.gov_cms_openpaymentsdata_dataset_General-Payment-Data-Detailed-Dataset-2019-Reporti_qsys-b88w
source:project_dbt.common.gov_cms_openpaymentsdata_dataset_General-Payment-Data-Detailed-Dataset-2020-Reporti_txng-a8vj
source:project_dbt.common.medicare_provider_utilization_and_payment_part_b
source:project_dbt.common.medicare_provider_utilization_and_payment_part_d
source:project_dbt.common.medicare_snf_claims_quality_measures
source:project_dbt.common.medicare_snf_health_deficiencies
source:project_dbt.common.medicare_snf_mds_quality_measures
source:project_dbt.common.medicare_snf_provider_information
source:project_dbt.common.medicare_snf_quality_reporting_program_provider_data
source:project_dbt.common.offices_v3
source:project_dbt.common.open_payments_providers_supplementary
source:project_dbt.common.provider_per_zip_v6
source:project_dbt.common.providers_per_team_v1
source:project_dbt.common.tam_predictors_v1
source:project_dbt.common.tam_results_per_provider_all_v2
source:project_dbt.common.tam_results_per_provider_latest
source:project_dbt.common.tam_territory_components_v1
source:project_dbt.common.territories_per_zip_v2
source:project_dbt.common.territories_v2
source:project_dbt.common.usa_census_data_20201022
source:project_dbt.geo.simplemaps_uszips
source:project_dbt.geo.zip

我想修改它以输入到 运行 的另一个命令 xargs

我试着用 perl 来实现这个:

cat /tmp/myfile.txt \
  | perl -pe 's{^(source:project_dbt\.)(.+)$}{mycompany_ sav_}m'

以便我可以获得所需的输出(即我只想使用 2 个不同的前缀重复第二个捕获组):

mycompany_common.business_days sav_common.business_days
mycompany_common.cms_compare sav_common.cms_compare
mycompany_common.cms_provider_national sav_common.cms_provider_national
mycompany_common.sav_-File_rta9-bts3 sav_common.gov_cms_data_Medicare-sav_Claims_Reassignment-Sub-File_rta9-bts3
mycompany_common.sav_-File_je57-c47h sav_common.gov_cms_data_Medicare-sav_Enrollment_Address-Sub-File_je57-c47h
mycompany_common.sav_-Enrollment-File_ykfi-ffzq sav_common.gov_cms_data_Medicare-Enrollment_Base-sav_Provider-Enrollment-File_ykfi-ffzq
mycompany_common.sav_-8qtj sav_common.sav_gov_cms_data_Medicare-Enrollment_Secondary-Specialty_n48j-8qtj
mycompany_common.sav_-Provider-Utilization-and-Payment-Data-Par_icvy-hptt sav_common.gov_cms_data_Medicare-Part-D_Medicare-Provider-Utilization-and-sav_Payment-Data-Par_icvy-hptt
mycompany_common.sav_-Physician-and-Other-Supplier-National-Pro_5fr6-cch3 sav_common.gov_cms_data_Medicare-Physician-Supplier_Medicare-Physician-and-Other-sav_Supplier-National-Pro_5fr6-cch3
mycompany_common.sav_sav_common.gov_cms_data_provider-data_dataset_mj5m-pzi6_National_Downloadable_File
mycompany_common.gov_cms_download_nppes_NPPES_Data_Dissemination sav_common.gov_cms_download_nppes_NPPES_Data_Dissemination
mycompany_common.sav_-Detailed-Dataset-2019-Reporti_qsys-b88w sav_common.gov_cms_openpaymentsdata_dataset_General-Payment-Data-Detailed-sav_Dataset-2019-Reporti_qsys-b88w
mycompany_common.sav_-Detailed-Dataset-2020-Reporti_txng-a8vj sav_common.gov_cms_openpaymentsdata_dataset_General-Payment-Data-Detailed-sav_Dataset-2020-Reporti_txng-a8vj
mycompany_common.medicare_provider_utilization_and_payment_part_b sav_common.medicare_provider_utilization_and_payment_part_b
mycompany_common.medicare_provider_utilization_and_payment_part_d sav_common.medicare_provider_utilization_and_payment_part_d
mycompany_common.medicare_snf_claims_quality_measures sav_common.medicare_snf_claims_quality_measures
mycompany_common.medicare_snf_health_deficiencies sav_common.medicare_snf_health_deficiencies
mycompany_common.medicare_snf_mds_quality_measures sav_common.medicare_snf_mds_quality_measures
mycompany_common.medicare_snf_provider_information sav_common.medicare_snf_provider_information
mycompany_common.medicare_snf_quality_reporting_program_provider_data sav_common.medicare_snf_quality_reporting_program_provider_data
mycompany_common.offices_v3 sav_common.offices_v3
mycompany_common.open_payments_providers_supplementary sav_common.open_payments_providers_supplementary
mycompany_common.provider_per_zip_v6 sav_common.provider_per_zip_v6
mycompany_common.providers_per_team_v1 sav_common.providers_per_team_v1
mycompany_common.tam_predictors_v1 sav_common.tam_predictors_v1
mycompany_common.tam_results_per_provider_all_v2 sav_common.tam_results_per_provider_all_v2
mycompany_common.tam_results_per_provider_latest sav_common.tam_results_per_provider_latest
mycompany_common.tam_territory_components_v1 sav_common.tam_territory_components_v1
mycompany_common.territories_per_zip_v2 sav_common.territories_per_zip_v2
mycompany_common.territories_v2 sav_common.territories_v2
mycompany_common.usa_census_data_20201022 sav_common.usa_census_data_20201022
mycompany_geo.simplemaps_uszips sav_geo.simplemaps_uszips
mycompany_geo.zip sav_geo.zip

但是当运行这样做时,结果是:

 sav_common.business_daysays
 sav_common.cms_compareare
 sav_common.cms_provider_nationalnal
 sav_common.gov_cms_data_Medicare-Claims_Reassignment-Sub-File_rta9-bts3ts3
 sav_common.gov_cms_data_Medicare-Enrollment_Address-Sub-File_je57-c47h47h
 sav_common.gov_cms_data_Medicare-Enrollment_Base-Provider-Enrollment-File_ykfi-ffzqfzq
 sav_common.gov_cms_data_Medicare-Enrollment_Secondary-Specialty_n48j-8qtjqtj
 sav_common.gov_cms_data_Medicare-Part-D_Medicare-Provider-Utilization-and-Payment-Data-Par_icvy-hpttptt
 sav_common.gov_cms_data_Medicare-Physician-Supplier_Medicare-Physician-and-Other-Supplier-National-Pro_5fr6-cch3ch3
 sav_common.gov_cms_data_provider-data_dataset_mj5m-pzi6_National_Downloadable_Fileile
 sav_common.gov_cms_download_nppes_NPPES_Data_Disseminationion
 sav_common.gov_cms_openpaymentsdata_dataset_General-Payment-Data-Detailed-Dataset-2019-Reporti_qsys-b88w88w
 sav_common.gov_cms_openpaymentsdata_dataset_General-Payment-Data-Detailed-Dataset-2020-Reporti_txng-a8vj8vj
 sav_common.medicare_provider_utilization_and_payment_part_bt_b
 sav_common.medicare_provider_utilization_and_payment_part_dt_d
 sav_common.medicare_snf_claims_quality_measuresres
 sav_common.medicare_snf_health_deficienciesies
 sav_common.medicare_snf_mds_quality_measuresres
 sav_common.medicare_snf_provider_informationion
 sav_common.medicare_snf_quality_reporting_program_provider_dataata
 sav_common.offices_v3_v3
 sav_common.open_payments_providers_supplementaryary
 sav_common.provider_per_zip_v6_v6
 sav_common.providers_per_team_v1_v1
 sav_common.tam_predictors_v1_v1
 sav_common.tam_results_per_provider_all_v2_v2
 sav_common.tam_results_per_provider_latestest
 sav_common.tam_territory_components_v1_v1
 sav_common.territories_per_zip_v2_v2
 sav_common.territories_v2_v2
 sav_common.usa_census_data_20201022022
 sav_geo.simplemaps_uszipsips
 sav_geo.zipzip

即第二个捕获组没有重复,而是将每行的最后 3 个字符附加到每一行...

我尝试了很多变体,但我无法确定我做错了什么。

在此先感谢您的帮助!

您将带有 Windows 行结尾 (CRLF) 的文件传递给期望 unix 行结尾 (LF) 的 Perl 版本。

给定输入

source:project_dbt.common.business_days␍␊
                   \___________________/|
                                      Removed by -l

程序发出

mycompany_common.business_days␍ sav_common.business_days␍␊
          \___________________/     \___________________/|
                                                     Added by -l

您的终端显示为

 sav_common.business_days_days
\_______________________/\___/
       Overwritten        From original

将文件转换为 unix 文件(例如使用 dos2unix)或删除尾随 CR (s/\s+\z//;)。