首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在带有变量和正则表达式的for循环中使用sed

在带有变量和正则表达式的for循环中使用sed
EN

Stack Overflow用户
提问于 2013-03-22 15:55:20
回答 4查看 8K关注 0票数 1

我正在尝试构建一个脚本,其中的一部分利用'sed‘将文件名标记到该文件中每行的末尾,然后将输出转储到主列表中。脚本中给我带来麻烦的部分如下:

代码语言:javascript
运行
AI代码解释
复制
DIR=/var/www/flatuser
FILES=$DIR/*
for f in $FILES
do
    echo "processing $f file...."
    sed -i "s/$/:$f/" $f
    cat $f >> $DIR/master.txt
done

问题是'sed‘语句在for循环之外工作得很好,但是当我把它放到脚本中时,我相信它在解释美元符号时遇到了问题。我尝试了几乎所有我能想到的“和”的组合,让它解释变量,它不断地要么在每一行的末尾放上"$f“,要么直接失败。

感谢您的任何意见!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-22 16:11:54

就我个人而言,我会这样做:

代码语言:javascript
运行
AI代码解释
复制
dir=/var/www/flatuser
for f in "$dir"/*; do
  [[ $f = */master.txt ]] && continue
  while read -r; do printf '%s:%s\n' "$REPLY" "${f##*/}"; done <"$f"
done >/var/www/flatuser/master.txt

它不会像sed -i那样就地修改文件,因此可以安全地多次运行( sed -i版本会在每次运行时就地将文件名添加到文件中,所以最终每行都会有多个文件名的副本)。

而且,sed -i不是由POSIX指定的,所以并不是所有的操作系统都有它。

票数 3
EN

Stack Overflow用户

发布于 2013-03-22 16:00:11

你只需要避开美元符号:

代码语言:javascript
运行
AI代码解释
复制
sed -i "s/\$/:$f/" "$f"

这样外壳就会把它直接传递给sed

为了扩展Charles Duffy关于引用变量的观点:

代码语言:javascript
运行
AI代码解释
复制
DIR=/var/www/flatuser
for f in "$DIR"/*
do
    echo "processing $f file...."
    sed -i "s/\$/:${f##*/}/" "$f"
    cat "$f" >> "$DIR/master.txt"
done

如果任何文件名包含空格,那么如果将文件名列表分配给$FILES,就会为时已晚;您无法再区分属于文件名的空格和分隔文件名的空格。您也可以使用数组,但将glob直接放在for循环中会更简单。下面是使用数组的方法:

代码语言:javascript
运行
AI代码解释
复制
DIR=/var/www/flatuser
FILES=( "$DIR"/* )
for f in "${FILES[@]}"
do
    echo "processing $f file...."
    sed -i "s/\$/:${f##*/}/" "$f"
    cat "$f" >> "$DIR/master.txt"
done

对于不使用-ised版本,这里有一个显式处理模拟就地编辑所需的临时文件的方法:

代码语言:javascript
运行
AI代码解释
复制
t=$(mktmp sXXXX); sed "s/\$/:$f/" "$f" > "$t"; mv "$t" "$f" && rm "$t"
票数 5
EN

Stack Overflow用户

发布于 2013-03-22 16:24:08

问题不在于美元符号。这是因为变量$f包含一个"/“字符,sed使用这个字符来分隔表达式。尝试使用"@“作为分隔符。

代码语言:javascript
运行
AI代码解释
复制
DIR=/var/www/flatuser
FILES=$DIR/*
for f in $FILES
do
    echo "processing $f file...."
    sed -i s@"$"@:"$f"@ $f
    cat $f >> $DIR/master.txt
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15574641

复制
相关文章
【Python】循环语句 ⑥ ( 变量作用域 | for 循环临时变量访问 | 分析在 for 循环外部访问临时变量的问题 | 在 for 循环外部访问临时变量的正确方式 )
如果需要在外部访问 for 循环的临时变量 , 建议将该 临时变量 预定义在 for 循环的外部 , 然后在后续的所有代码中可以访问该 临时变量 ;
韩曙亮
2023/10/11
7710
【Python】循环语句 ⑥ ( 变量作用域 | for 循环临时变量访问 | 分析在 for 循环外部访问临时变量的问题 | 在 for 循环外部访问临时变量的正确方式 )
Linux中sed工具的使用
sed 是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
谢公子
2022/01/19
2.3K0
Linux中sed工具的使用
带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败
就地编辑文件(如果提供了后缀,则进行备份),可见参数后缀 SUFFIX 是可选的,即带或者不带这个参数都可以执行。
程序熵
2023/09/25
3880
带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败
sed 使用正则表达式进行替换
echo "111(222)333" | sed 's/(\(.*\))\(.*\)/\2\2\2/'
2019/12/20
4.1K0
MySQL中变量的定义和变量的赋值使用
说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin…end块中,而普通的变量定义和使用都说的比较少,针对此类问题只能在官方文档中才能找到讲解。
全栈程序员站长
2022/06/30
9.3K0
02 . Shell变量和逻辑判断及循环使用
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
iginkgo18
2020/09/27
1.5K0
【lua菜鸟③】变量和循环
{lua的特点:①不需要分号结尾,但是支持分号啊,如果一行写多个语句就用它啊②没有花括号③函数也不需要声明类型,却和c++的语法极其类似}
福贵
2018/07/25
1.7K0
【lua菜鸟③】变量和循环
在递归函数中因不正确使用公共变量而形成死循环
昨天碰到了挺郁闷的错误,我写的一个递归函数,形成了死循环。代码如下: '递归删除频道,参数:频道ID Sub DeleteBoard(bid)     '删除该频道所有新闻     News.DeleteByCondition "BoardID=" & bid     '删除该频道所有子频道     Dim bs     bs = Board.GetList("FartherID=" & bid, false, -, -)     If IsArray(bs) Then         For i=LBo
大石头
2018/03/12
3.5K0
JSTL 和 JSP 中变量互相访问1)<%%>变量在jstl中获取的例子:2)jstl变量在<%%>中获取的例子:
1)<%%>变量在jstl中获取的例子: <% String username="zhangsan"; pageContext.setAttribute("username",username); %> <c:out value="${username}"/> 即:jsp 页面中<%%>中的变量在定义后,需要放置到pageContext属性中,才能被获取(当然也可以放置到request和session、 applicatio中,这要根据实际应用来做决定,一般只是在页面中使用的化,使用
孙亖
2018/06/07
7.3K0
正则表达式在js中的使用
test() 正则对象方法,用于检测字符串是否符合该规则,该对象会返回 true 或 false,其参数是测试字符串。
清出于兰
2020/10/26
2.3K0
正则表达式在js中的使用
在zabbix中实现发送带有图片的邮件和微信告警
可以手动触发一个报警测试效果,手机上就可以收到带图的报警了,点击消息之后的页面也可以看到历史的图片
没有故事的陈师傅
2019/11/10
2.4K0
使用grep和sed正则表达式从日志中提取信息
有时候在做简易日志分析的时候,需要从特定的日志记录中提取特定的信息 信息提取 假如有如下错误日志,我们需要提取shopId和orderNo {"@message":"[2021-08-04 00:10:00.756][scheduling-1][ERROR][ProfitSharingCrontabManager:235][maibao-transaction][b0dab5d4eaa9e063]: fail to request profit sharing: order[ProfitSharingFi
十毛
2022/01/12
1.1K0
dart - 如何在带有DartFlutter的不同类上使用变量
我有一类是我的getToken类。在此类中,我得到的 token 是字符串 token 。这是我的 getToken.dart
徐建国
2021/08/03
2.7K0
C++核心准则ES.86:避免在基本for循环的循环体中修改循环控制变量​
ES.86: Avoid modifying loop control variables inside the body of raw for-loops
面向对象思考
2020/06/11
1.8K0
ModelBuilder中的For循环和While循环
现在开始讲迭代器,迭代是指以一定的自动化程度多次重复某个过程,通常又称为循环。说的通俗点就是批量循环处理,简称批处理。
陈南GISer
2021/08/18
4.4K0
ModelBuilder中的For循环和While循环
现在开始讲迭代器,迭代是指以一定的自动化程度多次重复某个过程,通常又称为循环。说的通俗点就是批量循环处理,简称批处理。
陈南GISer
2021/08/18
21.5K0
sed 命令+正则表达式
sed是一个非交互性性文本编辑器, 它编辑文件或标准输入导出的文件拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道文件。sed可以随意编辑小或大的文件,有许多 sed命令用来编辑、删除,并允许做这项工作时不在现场。sed一次性处理所有改变,因而变得很有效,对用户来说,最重要的是节省了时间。sed必须通过行号和正则表达式指定要改变的文本行
一见
2018/08/07
3.4K0
Python中变量的定义使用和特点
变量的使用可以分为三个步骤来和大家讲解一下,一是定义变量、二是如何使用变量、三是总结变量的特点,下面我们就来用代码一个一个说明一下吧。
python自学网
2022/02/28
2.4K0
C++核心准则ES.74:尽量在循环变量初始化表达式中定义循环变量​
Limit the loop variable visibility to the scope of the loop. Avoid using the loop variable for other purposes after the loop.
面向对象思考
2020/06/03
9570
点击加载更多

相似问题

变量中带有"#“的SED

10

在for循环中使用sed和变量的Bash脚本?

20

带有变量和行号限制的Sed

31

使用带有正则表达式的Sed将结果保存到变量中

24

带有$ sign的sed变量

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文