- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编者按:
后来为了事后诸葛亮,对标题作了修改;有两个不同的问题:
(a)结果显示,输入文件只有\r
-行结尾(仅限CR)(经典的Mac OS样式)
(b)尝试在\t
regex中使用\r
和sed
失败,因为BSD Sed(在OSX上使用)不支持这种转义。
我正在开发一个自动程序,它使用Python查找和替换文本文件中的某些单词。程序使用字典,有些实例中用作替换的值是''
(意思是,没有)。我不认为这个程序引起了这个问题,但我只是在上下文中提到这个问题。(我认为问题在于sed
,所以我不愿意标记Python。)
文件中的某些行有前导空白,这些空白是在文件开头的某些单词被空替换后无意中创建的。我想摆脱他们,我认为在这种情况下sed
是最好的工具。
假设文本文件是这样的:
Display
Display
BOX,
sed
运行编辑过的文件:
sed -e 's/^[ \t]*//g'
Display
Display
BOX,
hello
hello
hello
sed
至少要工作一次呢?
xxd
输出(用X替换了大多数实际内容):
0000000: 2044 6973 706c 6179 2043 616c 6962 7261 X X
0000010: 7469 6f6e 2046 6978 7475 7265 2046 4952 X X X
0000020: 4d57 4152 4520 4b49 545e 4d20 4469 7370 X X^M X
0000030: 6c61 7920 4361 6c69 6272 6174 696f 6e20 X X
0000040: 4669 7874 7572 6520 524d 6163 426f 6f6b X X
0000050: 2041 6972 2028 3131 2d69 6e63 682c 204d X X
0000060: 6964 2032 3031 3229 2050 4f52 5420 4b49 X X) X X
0000070: 545e 4d42 4f58 2c20 5245 434f 5645 5259 T^MBOX, X
最佳答案
tl;博士
下面的任何解决方案都不会更新输入文件;独立的sed
命令可以使用-i ''
进行调整;需要先将awk
解决方案保存到其他文件。
操作系统的输入似乎是一个只有换行符的经典Mac OS文件
谢谢,阿尔维斯。
.\r
总是读取这样一个文件作为一个整体,这通常是不需要的,并且妨碍了OP的行前导空白裁剪方法。sed
因此是更好的选择,因为它允许指定什么构成换行符(通过所谓的输入记录分隔符):
更新:将原来的awk
命令替换为更简单、更快的替代命令,改编自peak's solution:
awk -v RS='\r' '{ sub(/^[ \t]+/, ""); print }'
awk -v RS='\r' '{ $1=$1; print }'
awk
分开,这是通常需要的。
\n
保留为换行符,请继续阅读。
\r
结尾的行;OP的特殊情况(行显然仅以
\n
结尾)在第二部分中处理。
\r
作为控制字符转义序列;因此,
\n
用于匹配制表符。不支持。
\t
):
sed 's/^[ '$'\t'']*//'
$'\t'
)使用ansic引用的字符串,但对于更复杂的脚本,这可能会变得棘手,因为这些字符串有自己的转义规则。
sed -e $'s/^[ \t]*//'
已被删除,因为它是无意义的,因为regex被锚定到输入的开头(
g
)。
^
实例,而不是Sed需要分隔行的
\r
实例。
\n
\r
终止一个行。
by itself
:将
cat -et
实例可视化为
\r
,而将
^M
实例可视化为
\n
(另外,
$
实例可视化为
\t
)。
^I
个实例,但没有
^M
个实例,则意味着行不会以
$
结尾(同时),整个输入文件被视为单个字符串,这就解释了为什么只处理第一个输入“行”:
\n
只在整个字符串的最开始处匹配。
^
是更好的选择:
awk -v RS='\r' '{ sub(/^[ \t]+/, ""); print }'
awk
告诉Awk通过
\n
实例将输入拆分为记录(特殊变量
-v RS='\r'
包含输入记录分隔符)。
\r
搜索输入行上第一个出现的regex
RS
,并将其替换为
sub(/^[ \t]+/, "")
,即,它有效地修剪了每个输入行的前导空格和制表符。注意,不带显式第三个参数的
^[ \t]+
隐式操作整个输入行。
""
然后打印可能修改的输入行。
sub()
是Awk的默认输出记录分隔符(
$0
),输出记录将被
print
终止。
\n
作为行分隔符:
awk 'BEGIN { RS=ORS="\r" } { sub(/^[ \t]+/, ""); print }'
OFS
将输入和输出记录分隔符设置为
\n
。
\r
结尾的变量简化为:
awk -v RS='\r' '{ $1=$1; print }'
RS=ORS="\r"
(也不设置
\r
,脚本中的输入字段分隔符)意味着Awk通过运行空格(空格、制表符、换行符)将输入记录拆分为字段。
\n
是一种虚拟赋值,其目的是触发输入行的重新生成,每当字段变量被赋值时,都会发生这种情况。
-F
1
sed $'s/^[ \t]*//; s/\r[ \t]*/\\\n/g' # note the $'...' to make \t, \r, \n work
FS
结尾的行,这在Unix上是常见的。
$1=$1
作为行分隔符,请使用以下内容-但请注意,BSD Sed将始终在最后添加一个
OFS
。
sed $'s/^[ \t]*//; s/\r[ \t]*/\r/g'
sed
将所有
\n
实例替换为
\r
实例,并将结果传递到原始
\n
命令的BSD Sed友好版本:
\r
关于macos - sed仅替换特定文件的第一个前导空格匹配-处理仅CR的行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35327981/
我需要一些有关 Sed 的帮助。我在 Windows 和 Mac OSX 上使用它。我需要 Sed 添加一个 每 4 行,在第一个 之后找到,并在 上停止这样做 我就是找不到办法做到这一点。每
我是一个管理很多网站的轮换团队的一员,我们继承了一个网站的一些特别糟糕的代码,我们正在彻底重新设计该网站。非常可怕的是,开发服务器上有一些链接将您带到实时服务器和旧域以及许多其他可怕的事情。 我一直在
我正在尝试在脚本中运行以下表达式以查找设备并在html文件中更改与该设备关联的字段之一。 sed -e "s/$OLDTEST/$TESTING/" -e "s/$CURRENTVALU/$NEWST
我正在尝试使用 sed 删除所有出现的 #ifdef _WIN32 #endif #ifdef 和 #endif 之间存在的所有内容都是空行。我使用 sed 的经验有限,我已经阅读了一些关于多行功能的
以下命令是什么意思: sed -e '/SUBCKT\ REDBK128S4_LC/,/ENDS/ d' $1 什么,代表? 最佳答案 如果指定两个地址,则指定执行命令的行范围。在您的 sed表达
我需要使用sed注释匹配行和其后的4行的帮助。 在文本文件中。 我的文本文件是这样的: [myprocess-a] property1=1 property2=2 property3=3 proper
我想要一个sed命令来完成以下任务: $ sed s'/:/ /g' sed s'/=/ /g' 也就是说,我想写 sed s'// /g' 并用空格替换=和:。 最佳答案 sed s'/[:=]/
我想在大文件中每隔30行插入一个字符串。我正在使用mini-sed,它不支持〜(波浪号)范围运算符。我正在寻找仅sed的解决方案。 最佳答案 该线程是如何使事情过于复杂的另一个示例。应该这样做: se
有人可以帮我吗? grep " 287 " file.txt | grep "HI" | sed -i 's/HIS/HID/g' sed: no input files 也尝试过 xargs gre
这个问题已经有答案了: How can I replace each newline (\n) with a space using sed? (43 个回答) 已关闭2 年前。 如何使用 sed 命
我们需要屏蔽信用卡号。屏蔽除最后 4 位数字以外的所有数字。我正在尝试使用 SED。由于信用卡号长度从 12 位到 19 位不等,我正在尝试编写正则表达式。以下代码将收到字符串。如果它包含形式为“CA
例如: sed 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' abc.txt 's@' 、 '(' 、 '\?' 、'&' 和 '@' 等含义是什么? 如何找到最合适
我们有一个进程可以使用包含 sed 的文件更改管道输入的命令。 我需要用变量值替换输入中的占位符,例如在一个 -e我可以运行的命令类型; $ echo "Today is XX" | sed -e "
这个问题在这里已经有了答案: Using different delimiters in sed commands and range addresses (3 个答案) 关闭1 年前。 我想问 2
是的,我搜索了该网站,但我认为我没有看到任何东西可以专门解决我无法克服的非常(我想很简单)的问题。 我正在上 Linux 类(class),有人问我这个问题: Use the sed command
我有一个看起来像这样的文件路径列表 abc/def/ghi/jl/r1/r2 abc/def/ghi/jl/r9/r11 abc/nyc/ghi/jl/r3/r4/r5 abc/nyc/ghi/jl/
我在这个文件中有这个文本: test.php $databases = array ( 'default' => array ( 'default' => array (
让我们考虑一个包含以下语句的 SQL 文件作为输入(即 myTable.sql): EXECUTE IMMEDIATE 'CREATE OR REPLACE PUBLIC SYNONYM ' || m
好的,谷歌搜索几分钟后,这似乎是在每行输出前加上 sed 前缀的常规方法 但是我得到一个我不明白的错误。 这是什么意思,我该如何解决? $ sed 's/^/#/' test.txt sed: -e
我有以下文件列表: r1 r2 10 r11 r99 我正在尝试替换 ls 输出中文件名中 r 之后的所有数字 我要找的结果: rA rA rA rA rA 使用下面的 sed 命令我可以匹配
我是一名优秀的程序员,十分优秀!