【发布时间】:2010-12-11 00:46:49
【问题描述】:
我是 bash 脚本的新手,但我想做以下事情:
我想检测 FILE_1 中的模式 STRING_1 "STRING_2" 并将 STRING_2 附加到 FILE_2
有什么简洁的方法可以做到这一点?
【问题讨论】:
标签: regex linux bash shell scripting
我是 bash 脚本的新手,但我想做以下事情:
我想检测 FILE_1 中的模式 STRING_1 "STRING_2" 并将 STRING_2 附加到 FILE_2
有什么简洁的方法可以做到这一点?
【问题讨论】:
标签: regex linux bash shell scripting
您的问题相当模糊;但我猜你想要什么
如果 FILE_1 中存在 STRING_1,则将 STRING_2 附加到 FILE_2
answer=`grep -c STRING_1 FILE_1`
if [ "$answer" -gt 0 ]
then
echo "$STRING_2" >> FILE_2
fi
【讨论】:
grep -c STRING_1 FILE_1 && echo "$STRING_2" >> FILE_2 :) 但我不确定他的意思,虽然这个问题很模糊..
STRING_2 未知,则不能使用它。 redShadow 建议的替代方案,但仍使用if 将是:if grep -sq STRING_1 FILE_1; then。不需要变量、括号或比较。
你可以这样做:
sed 's/STRING_1 \"(.*)\"/\1/g' FILE_1 >FILE_2
这里发生的事情是,sed 正在搜索 FILE_1 的第一个和第二个“/”之间的所有内容,并将第二个和第三个“/”之间的内容发送到 FILE_2。
() 组分配给 \1、\2 等...所以 \" 之间的所有内容都是您的 STRING_2。
【讨论】:
>>追加。不必转义双引号,而是转义括号(除非您使用sed 的-r 选项。将模式从.* 更改为[^"]* 可能会更好,因为@987654327 @ 正则表达式是贪婪的。
grep -Po '(?<=aaa ")([^"]*)(?=")' FILE_1 >> FILE_2
【讨论】:
-o 一起使用,但它似乎有效,并且是避免使用grep | sed 管道的好方法..跨度>
如果我正确理解了这个问题,那么你有一个文件包含:
word1a "word1b"
word2a "word2b"
word3a "word3b"
您可以使用 sed 提取引号之间包含的值,然后重定向到文件
sed 's/.*"\(.*\)"/\1/' FILE_1 > FILE_2
【讨论】:
你也可以用这个:
grep '^\s*STRING_1\s*\".*\"\s*$' FILE_1 | awk -F \" '{printf $2"\n"}' >> FILE_2
它可以正确处理输入文件的多个空白字符,并在 FILE_2 末尾的 STRING_2 之后附加一个换行符。
【讨论】:
这就是我现在拥有的:
sed 's/STRING_1\s*:\s*"([^"]*)"/\1/g' "FILE_1" >> FILE_2;
我希望它检测文件 1 中的以下模式:
STRING_1 : "STRING_2"
并将 STRING_2 保存到文件 2
但这不起作用,它会在 FILE_2 中附加很多随机内容(不应该匹配)
【讨论】: