我有一个文本文件,我想找到所有ID:=“abc123”,当它发现我希望它取abc123的值并创建一个新行并有一个set字符串newId:=“ abc123如何在终端内执行此操作?
我想使用bash,下面是一些示例,找到字符串'“ID”:“,复制值(abc123)并使用此数据创建一个新行。
"ID": "abc123"
"newID": "abc123"
答案 0 :(得分:4)
你可以这样做:
sed -e 's/^"ID": "\(.*\)"/&\
"newID": "\1"/' myfile.txt
首先,我将尝试解释搜索匹配的正则表达式:
^
匹配行的开头"ID": "
匹配精确字符串\(.*\)
匹配任何字符(*
)的零个或多个(.
)的序列。将此表达式放在反斜杠括号之间会创建一个“捕获”,这允许我们将匹配的结果部分存储到辅助变量\1
中。"
匹配双引号字符找到匹配项时,会将其替换为:
&
比赛本身。此运算符是一个辅助变量,表示匹配的内容。\<new-line>
反斜杠后跟一个实际的新行字符会转义一个新行,即。它允许我们在替换"newId": "
打印出确切的字符串\1
打印我们捕获的内容,因此它会打印我们找到的ID "
打印双引号字符。希望这有助于=)
答案 1 :(得分:1)
尝试这样做:
sed -r 's@^"ID": "([a-Z0-9]+)"@"newID": "\1"@' file.txt
sed
:可执行文件-r
:扩展模式(无需反斜杠括号)s
:我们执行替换,骨架为s@origin@replacement@
(分隔符可以是任何内容)^
:表示 regex ( )
:括号是捕获 "newID":
是新字符串的开头\1
:是替换字符串的结尾(捕获的字符串)答案 2 :(得分:-1)
考虑到你的问题很模糊,我做了一些假设,这些假设在我的实施中会很明显。
输入文件 - 调用它
ID="one"
dkkd
ID="two"
ffkjf
ID="three"
ldl
命令在输入文件上运行
for line in `cat t`; do newID=`echo $line | grep ID | cut -d= -f2`; if [[ "$newID" != "" ]]; then echo $line >> t2; echo newID=$newID >> t2; else echo $line >> t2; fi; done
输出文件 - 名称为t2(从命令中显而易见)
ID="one"
newID="one"
dkkd
ID="two"
newID="two"
ffkjf
ID="three"
newID="three"
ldl
基本上这个命令在文件中逐行(在本例中称为t)查找ID行。如果它找到一个得到它的值,则打印带有ID的原始行,然后打印另一个后面跟着newID的行。如果有问题的行没有ID,那么它只是打印自己的行。
注意事项:
如果文件中包含“ID”的任何其他行但不是您请求的普通ID,则不起作用。