- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
开门见山,我想知道如何使用 grep/find/sed/awk 来匹配某个字符串(以数字结尾)并将该数字递增 1。我最接近的是连接一个 1 到最后(效果很好),因为要点是简单地更改值。这是我目前正在做的事情:
find . -type f | xargs sed -i 's/\(\?cache_version\=[0-9]\+\)/\11/g'
因为我不知道如何增加数字,所以我捕获了整个东西并附加了一个“1”。之前,我有这样的事情:
find . -type f | xargs sed -i 's/\?cache_version\=\([0-9]\+\)/?cache_version=\11/g'
所以至少我知道如何捕捉我需要的东西。
我不会解释这是做什么用的,我只会解释我想要它做什么。它应该在任何文件中找到文本,递归地,基于当前目录(不重要,它可以是任何目录,所以我稍后会配置它),匹配“?cache_version =”和一个数字。然后它将递增该数字并在文件中替换它。
目前我上面的东西是有效的,只是我不能在最后增加找到的数字。能够递增而不是附加“1”会更好,这样 future 的值就不会是“11”、“111”、“1111”、“11111”等等。
我已经阅读了数十篇文章/解释,而且通常情况下,建议是使用 awk
,但我终究不能混合使用它们。我最接近使用 awk
的是:
grep -Pro '(?<=\?cache_version=)[0-9]+' . | awk -F: '{ print "match is", $2+1 }'
我想知道是否有某种方法可以在末尾通过管道传输 sed
并传递原始文件名,以便 sed
可以具有文件名和递增的数字(来自 awk
),或者 xargs
所需要的任何东西。
从技术上讲,这个数字并不重要;此替换主要是为了确保那里有一个新号码,肯定与上一个号码 100% 不同。因此,当我写这个问题时,我意识到我还不如使用系统时间 - 自纪元以来的秒数(AJAX 经常使用这种技术来消除后续“相同”请求的缓存)。我最终得到了这个,它看起来很完美:
CXREPLACETIME=`date +%s`; find . -type f | xargs sed -i "s/\(\?cache_version\=\)[0-9]\+/\1$CXREPLACETIME/g"
(我首先存储该值,以便所有文件都获得相同的值,以防它因任何原因跨越多秒)
但我仍然很想知道原来的问题,即递增匹配的数字。我猜一个简单的解决方案是使它成为一个 bash 脚本,但我仍然认为有一种比递归循环遍历每个文件并检查其内容是否匹配然后替换更简单的方法,因为它只是增加匹配的数字......没有太多其他逻辑。我只是不想写入任何其他文件或类似的东西 - 它应该就地完成,就像 sed
对“i”选项所做的那样。
最佳答案
我认为查找文件对您来说不是困难的部分。因此,我直奔主题,进行 +1 计算。如果您有 gnu sed,可以通过以下方式完成:
sed -r 's/(.*)(\?cache_version=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' file
举个例子:
kent$ cat test
ello
barbaz?cache_version=3fooooo
bye
kent$ sed -r 's/(.*)(\?cache_version=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' test
ello
barbaz?cache_version=4fooooo
bye
如果你愿意,你可以添加 -i 选项。
编辑
/e
允许您将匹配的部分传递给外部命令,并用执行结果进行替换。仅限 Gnu sed。
看这个例子:使用了外部命令/工具echo
, bc
kent$ echo "result:3*3"|sed -r 's/(result:)(.*)/echo \1$(echo "\2"\|bc)/ge'
给出输出:
result:9
您可以使用其他强大的外部命令,例如 cut、sed(再次)、awk...
关于bash - 如何使用 sed/awk 查找/替换和增加匹配的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14348432/
是否可以从 awk 文件执行另一个 awk 文件?使用 awk 文件我需要执行当前文件夹中的所有 awk 文件。是否可以在 awk 中进行此类操作? 最佳答案 是的你可以。您需要使用 system()
这是一个 awk 脚本,它尝试根据第一列设置两个文件的差异: BEGIN{ OFS=FS="\t" file = ARGV[1] while (getline < file)
awk 逐行处理文件。假设每一行操作不依赖于其他行,有没有办法让 awk 一次并行处理多行? 是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据? 最佳答案 唯一试图提供 awk 并行实现的
我有文件: 结果.txt Apple fruits 10 20 30 Car vehicle 40 50 60 Book study 70 80 90 假设这里第 2 列是特征,第 3 列是最小值
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我对 awk 的行为感到惊讶表演时浮点数 计算。它导致我对表格数据进行错误计算。 $ awk 'BEGIN {print 2.3/0.1}' 23 0.1}' )。 那么我应该如何执行大于 (
为什么我在下面的例子中得到分隔符前后的空格? awk -F'^' '{print $1,":",$2}' SERVER_2012-02-29-12-15-00 3969 : 1272 3969 :
我有一个文件,其中每四行是这样的: HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG (对于那些感兴趣的人,此文件包含DNA序列) 我需
你能帮我按 $2 列中的坐标合并行吗?有一系列坐标以一个为单位增长。我想输出 f.e. :第 1 行合并到第 4 行 9079811-9079814,之后没有系列,因此将其合并到另一行等。对于输入中的
大家好,我是 awk 的新手,我可以问一下我有这样的输入文件吗: # ABC DEFG value1 GH value2 GH value3 GH # BCF SQW value4 GH value5
大家好,我想问一下,我对awk中的括号{}感到非常困惑,就像我写了一段代码 { FNR == 3 { print $1 " age is " $2 } } 但它在外括号上给了我错误但没有在打印语
我想知道如何在 awk 中使用多行注释。到目前为止,我一直在使用 # 来评论一行。有人可以就此指导我。谢谢你。 最佳答案 AWK 中没有多行注释,但如果需要,您可以伪造它。这是一种至少适用于 GNU
关于AND逻辑运算符的一个基本问题。我试图根据第1列和第2列的值提取数据文件niveles.csv中的某些字段。我想写一个awk语句,说“当field1 = date和field2 = area然后打
以下命令按预期工作。 # some command | awk '/(\|\|\)/,/;/' create table todel1 (id int) max_rows=2 /*!*/; alter
我有一个日志文件,需要在服务器上“重播”。 它包含这样的条目: Request: query: EXEC prc_insert_customer @param0: 11
如何从制表符分隔的字符串中选择第一列? # echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{prin
我正在尝试在目录中的多个文件的内容中执行一些 grep 并将我的 grep 匹配附加到单个文件中,在我的输出中我还想要一个包含文件名的列,以了解哪些文件条目已被拾取。我试图使用 awk 来实现相同的目
我想选择文件中第9列的绝对值小于500的行。列有时为正,有时为负。 awk -F'\t' '{ if ($9 output.bam 到目前为止这不起作用..互联网上的一轮告诉我,要使用绝对值,我们应
例如,假设我运行以下命令: gawk -f AppendMapping.awk Reference.tsv TrueInput.tsv 假设文件名会改变。在遍历第一个文件时,我想创建一个映射。 map
我正在使用这个命令; awk -v regex1='new[[:blank:]]+File\(' 'BEGIN{print "Regex1 =", regex1}' 这警告我; awk: warnin
我是一名优秀的程序员,十分优秀!