Regex 使用awk或sed将文件的特定区域输出到另一个文件?

Regex 使用awk或sed将文件的特定区域输出到另一个文件?,regex,bash,awk,sed,Regex,Bash,Awk,Sed,我有一个文件如下所示: d "Text 1":6,64;1 /filesys1/db1.d2 d "Text 2":6,64;1 /filesys1/db1.d2 f 730 d "Text 3":6,64;1 /filesys1/db1.d2 d "TextA":6,64;1 /filesys1/db1.d2 f 46000 d "TextB":6,64;1 /filesys1/db1.d2 d "TextC":6,64;1 /filesys1/db1.d2 f 120000 ... 我需

我有一个文件如下所示:

d "Text 1":6,64;1 /filesys1/db1.d2
d "Text 2":6,64;1 /filesys1/db1.d2 f 730
d "Text 3":6,64;1 /filesys1/db1.d2 
d "TextA":6,64;1 /filesys1/db1.d2 f 46000
d "TextB":6,64;1 /filesys1/db1.d2
d "TextC":6,64;1 /filesys1/db1.d2 f 120000
...
我需要得到引号之间的所有内容,然后是行的最后2个字符,并将其放入一个新文件中。我可以分别做这两件事,但我不能把它们结合起来,让它发挥作用

awk -F'"' '$0=$2' datatmp4 > dataout2
我会得到:

Text 1
Text 2
Text 3
TextA
TextB
TextC
d2
30
d2
00
d2
00

我会得到:

Text 1
Text 2
Text 3
TextA
TextB
TextC
d2
30
d2
00
d2
00
我需要的是:

Text 1 d2
Text 2 30
Text 3 d2
TextA 00
TextB d2
TextC 00
与sed(BRE)合作:

sed的另一种方式(ERE):

使用awk:

awk -F'"' '{ print $2 " " gensub(/.*(.[^ ])/, "\\1", 1)}' file

字段分隔符是引号
gensub
替换第行中除最后两个字符(第二个字符不能是空格)以外的所有字符。

您可以使用$2将结果连接到引号之间的文本以及最后两个字符的结果,如下所示:

awk -F '"' '{print $2, substr($NF, length($NF)-1, length($NF))}' datatmp4 > dataout

你把事情弄得太难了。当您只需要整行的最后2个字符时,没有理由关心或尝试操作行($NF)上的最后一个字段:

$ awk -F'"' '{print $2, substr($0,length()-1)}' file
Text 1 d2
Text 2 30
Text 3 2
TextA 00
TextB d2
TextC 00

第三行输出以
2
结尾,因为这是输入文件中的内容。这与您发布的所需输出不匹配,但请明确-您是希望每行的最后一个字符如我所示且您所说的那样,还是希望最后两个非空白字符如您发布的所需输出所示?

其中一行的最后一个字符是空格,不知道这是否是打字错误,但它将打破此答案。对,基于长度的substr选择也会这样做。不,因为您定义了不同的
FS
,OP忽略了由于默认值
FS
,最后的空格,尽管他们说的答案非常有用
,所以不知道实际上您应该声明这是第三个要匹配的参数()的gawk特定值。您得到了gensub()args错误。您现在所做的将使用
$4
作为执行替换的次数计数,并且由于缺少第4个arg,它将在默认的$0上运行。假设您尝试使用$4执行某项操作,它将是
gensub(/.*(..)/,“\\1”,1,$4)
,但只有3个
-OPs示例中的分隔字段无论如何都不起作用。另外,与打印$2“gensub…不同,您应该让OFS来完成它的工作:
打印$2,gensub…
。顺便说一句,我没有投反对票。@EdMorton:你说得对,这是字段3,根本不需要目标参数。请注意,奇怪的是,
gensub(/.*([^]{2})/,“\\1”,$4)
返回良好的结果(即使是错误的)。
gensub(/.*([^]{2})/,“\\1”,$4)
生成预期的输出,因为gawk将其解释为
gensub(/.*([^]{2})/,“\\1”,“$4,$0)
因此它将
$4
的值视为3rg参数,因此如果
$4
以g/g开头,则gensub将进行全局替换,如果
$4
是一个数字N,则gensub将在第N次出现regexp时进行替换,如果
$4
是其他值,那么gawk会将其视为
1
,并在第一次出现regexp时进行替换。在这种情况下,
$4
总是
NULL
被视为
1
,因此它相当于所需的
gensub(/.*([^]{2})/,“\\1”,1)
;t不需要第三个参数到substr()-默认行为是打印到作为第一个参数传递的字符串末尾。
$ awk -F"\"" '{match($NF,/..$/,a); print $2,a[0]}' last2
Text 1 d2
Text 2 30
Text 3 2
TextA 00
TextB d2
TextC 00
$ awk -F'"' '{print $2, substr($0,length()-1)}' file
Text 1 d2
Text 2 30
Text 3 2
TextA 00
TextB d2
TextC 00