regex - 如何根据数据的存在替换一行中的某些字符...?

标签 regex linux awk sed

我有几个具有格式化数据的文件。根据文件的不同,格式会有所不同。 基于此,我使用变量来定义位置,所以我只需要在我的脚本中更改变量。

我现在正在处理的脚本,我想在文件的某个位置查找数据的“存在”。如果数据存在(非空白),那么我需要拆分该数据并将该数据的一半移动到另一个部分,并将数据的后半部分移动到另一个位置。 以下是描述我正在尝试做的事情的职位和一些概念性数据。

Field_1_Position=26

Field_2_Position=41

Field_3_Position=56

Field_Length=10

当前数据:

         1         2         3         4         5         6         7
1234567890123456789012345678901234567890123456789012345678901234567890
---------|---------|---------|---------|---------|---------|---------|    
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXXZZYYXXWWVVXXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXXMMNNOOPPQQXXXXXAABBCCDDEEZZZZZ

我的问题是(我正在调用的)字段 2。大多数情况下,这 (10) 个字符是空白的(不是此处表示的“破折号”!)。但是,如果数据确实存在,我需要采取将前五个字符放入字段 1 的前五个字符,然后我需要将字段 2 的后五个字符放入字段 3 的前五个字符。这 10 个字符为空的字段需要保留为是(虽然我想将它们保留为字段,以便我可以插入转义码来为列着色,以描绘由变量定义的字段。

期望:

         1         2         3         4         5         6         7
1234567890123456789012345678901234567890123456789012345678901234567890
---------|---------|---------|---------|---------|---------|---------|    
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXXZZYYX34455XXXXXZZYYXXWWVVXXXXXXWWVVCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXX1122334455XXXXX----------XXXXXAABBCCDDEEZZZZZ
201401010001AABBCCDDXXXXXMMNNO34455XXXXXMMNNOOPPQQXXXXXOPPQQCDDEEZZZZZ

感谢对此的任何想法!

--编辑以显示示例数据的实际位置编号。 KSL.

最佳答案

cat current.txt \
| awk '{
 if(substr($0,41,10)=="----------") {print $0} else {
  printf substr($0,1,25)substr($0,41,5)substr($0,31,5)substr($0,36,20)substr($0,46,5)substr($0,61,99)"\n"}}'

您可以将字段位置作为变量传递给 awk:

awk -v field1=26 -v field2=41 -v field3=56

关于regex - 如何根据数据的存在替换一行中的某些字符...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24767023/

相关文章:

regex - 将文本从一行复制到另一行

bash - 如何根据匹配的关键字段用另一个文件中的行替换文本文件中的行?

regex - 使用 Perl 正则表达式搜索并替换特定长度的字符串

Java 正则表达式 : Replacing dynamic substrings

perl - awk 文件操作

c - Linux 上的 System V 消息队列无法按预期工作

linux - Bash 脚本检查远程运行命令的权限

Java 正则表达式 : Meaning of expression

ruby - 如何使用 webmock 正则表达式匹配器?

ruby-on-rails - 每当 gem cronjob 不从/etc/environment 加载 PATH