unix Linux -从第一个出现的字符获取子字符串

nom7f22z  于 2022-11-04  发布在  Unix
关注(0)|答案(5)|浏览(228)

文件1.TXT

0020220101

20220101年1月
需要从文本从2开始的文件中添加额外的日期部分
已尝试的选项:

t_FILE_DT1='awk -F"2" '{PRINT $NF}' FILE1.TXT'
t_FILE_DT2='cut -d'2' -f2- FILE1.TXT'

echo "$t_FILE_DT1"
echo "$t_FILE_DT2"

第一次输出:0101
第二输出:0220101
预期输出:20220101年
我是Linux脚本的新手,有人能帮我指导我哪里出错吗?

wpx232ag

wpx232ag1#

grep的用法如下:

echo "0020220101\n01 20220101" | grep -P -o '\d{8}\b'
20220101
20220101

在这里,GNU grep使用以下选项:
-P:使用Perl正则表达式。
-o:仅打印匹配项(每行1个匹配项),而不是整行。

另请参阅:

grep manual
perlre - Perl regular expressions

gorkyyrv

gorkyyrv2#

使用任何awk:

$ awk '{print substr($0,length()-7)}' file
20220101
20220101

以上是在此输入文件上运行的:

$ cat file
0020220101
01 20220101

关于你的问题中的PRINT $NF-PRINT!= print。摆脱使用全大写的习惯,除非你在写Cobol。请参阅correct-bash-and-shell-script-variable-capitalization了解一些原因。
脚本中的2告诉awka和cut使用字符2作为字段分隔符,这样每个字符串都会在出现2的地方将输入划分为子字符串。
您的问题中的'是单引号,用于使字符串成为文字,您打算使用反勾号cmd,但无论如何,这些都是不赞成使用的,而赞成使用$(cmd)

bfrts1fy

bfrts1fy3#

我会在2 ...之后寻找“(不用担心是否也有空间))
相反,想想提取最后8个字符,你知道事实上是你的日期。

input="/path/to/txt/file/FILE1.TXT"
while IFS= read -r line
do
   # read in the last 8 characters of $line .. You KNOW this is the date .. 
   # No need to worry about exact matching at that point, or spaces .. 

   myDate=${line: -8}
   echo "$myDate"
done < "$input"
dldeef67

dldeef674#

关于您尝试的cut和awk命令:
使用awk -F"2" '{PRINT $NF}' file会将字段分隔符设置为2,并且$NF是最后一个字段,因此打印最后一个字段的值为0101
使用cut -d'2' -f2- file时也使用分隔符2,然后从第二个字段0220101开始打印所有字段
如果要匹配2后面跟着7位数字直到字符串的末尾:

awk '
match ($0, /2[0-9]{7}$/) {
  print substr($0, RSTART, RLENGTH)
}
' file

输出量

20220101
i2loujxw

i2loujxw5#

可接受的答案显示了如何提取前八位数字,但这不是您所要求的。

grep -o '2.*' file

将从第一次出现的2中提取,并且

grep -o '2[0-9]*' file

将提取每次出现2后的所有数字。如果您特别想要八位数字,请尝试

grep -Eo '2[0-9]{7}'

如果您只想接受两个单词边界之间的匹配,也可以使用-w选项。如果您特别希望只接受第一次出现2之后的数字,可以尝试

sed -n 's/[^2]*\(2[0-9]*\).*/\1/p' file

相关问题