从一行复制文本并在其下创建一个新行

时间:2012-10-18 15:59:44

标签: bash terminal

我有一个文本文件,我想找到所有ID:=“abc123”,当它发现我希望它取abc123的值并创建一个新行并有一个set字符串newId:=“ abc123如何在终端内执行此操作?

我想使用bash,下面是一些示例,找到字符串'“ID”:“,复制值(abc123)并使用此数据创建一个新行。

"ID": "abc123"
"newID": "abc123"

3 个答案:

答案 0 :(得分:4)

你可以这样做:

sed -e 's/^"ID": "\(.*\)"/&\
"newID": "\1"/' myfile.txt

首先,我将尝试解释搜索匹配的正则表达式:

  1. ^匹配行的开头
  2. "ID": "匹配精确字符串
  3. \(.*\)匹配任何字符(*)的零个或多个(.)的序列。将此表达式放在反斜杠括号之间会创建一个“捕获”,这允许我们将匹配的结果部分存储到辅助变量\1中。
  4. "匹配双引号字符
  5. 找到匹配项时,会将其替换为:

    1. &比赛本身。此运算符是一个辅助变量,表示匹配的内容。
    2. \<new-line>反斜杠后跟一个实际的新行字符会转义一个新行,即。它允许我们在替换
    3. 中打印新的行字符
    4. "newId": "打印出确切的字符串
    5. \1打印我们捕获的内容,因此它会打印我们找到的ID
    6. "打印双引号字符。
    7. 希望这有助于=)

答案 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,则不起作用。