0

我有一个文本文件,我想在其中找到所有 ID:= "abc123" 当它发现我希望它采用 abc123 的值并创建一个新行并设置一个字符串 newId:= "abc123 怎么能我在终端内这样做?

我想用bash,下面是一些例子,找到字符串'“ID”:“,复制值(abc123)并用这个数据换行。

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

3 回答 3

4

你可以这样做:

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

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

  1. ^匹配行首
  2. "ID": "匹配那个确切的字符串
  3. \(.*\)*匹配任意字符 ( )的零个或多个 ( ) 序列.。将此表达式放在反斜杠括号之间会创建一个“捕获”,它允许我们将匹配的结果部分存储到辅助变量\1中。
  4. "匹配双引号字符

当它找到匹配项时,将其替换为:

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

希望这会有所帮助=)

于 2012-10-18T16:34:42.090 回答
1

尝试这样做:

sed -r 's@^"ID": "([a-Z0-9]+)"@"newID": "\1"@' file.txt
  • sed: 可执行文件
  • -r: 扩展模式(不需要反斜杠括号)
  • s:我们执行替换,骨架是s@origin@replacement@(分隔符可以是任何东西)
  • ^: 表示正则表达式中的行首
  • ( ): 括号是捕获
  • "newID":是新字符串的开始
  • \1: 是替换字符串的结尾(捕获的字符串)
于 2012-10-18T16:22:14.657 回答
-1

考虑到您的问题非常模糊,我做了一些假设,这些假设将在我的实施中变得显而易见。

输入文件——称之为 t

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,这将不起作用。

于 2012-10-18T16:21:39.990 回答