我有一个这样的文件:
AAAA
BBBB
CCCC
DDDD
etc
单词在单独的行中。我想使用添加它们的引号tr
。
所以我尝试了以下方法:
1)在每个单词的开头添加引号,即'AAAA
tr '^\w$' '\'\w$' <file.txt
不起作用tr '^\w$' ''\w$' <file.txt
不起作用
上述两种情况都会导致命令行卡住。
2)要在末尾添加引号,我尝试过:
tr '\n' ''\n' <file.txt
但这不起作用并且命令行卡住了。
为什么这些正则表达式不能与 一起使用tr
?
答案1
您不能用 来替换多个这样的东西tr
。我会用sed
这样做来代替。
例子
$ sed "s/^/'/" file.txt
'AAAA
'BBBB
'CCCC
'DDDD
表示找到每行的开头 ( ^
) 并将其替换为单引号 ( '
)。
如果您想将“单词”括在单引号中,可以使用以下形式的命令:
$ sed "s/\(.*\)/'\1'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'
这次我们将线路上的所有内容保存在临时变量 ( \1
) 中。然后我们用这个替换该行'\1'
。
该命令可以缩写为:使用 GNU 特定开关:
$ sed -r "s/^(.*)$/'&'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'
答案2
tr
是为了音译。一种流行的用法tr
是更改字符串的大小写:
$ echo 'this is a test' | tr a-z A-Z
THIS IS A TEST
某些操作系统版本tr
,需要a-z
采用以下形式[a-z]
,在这种情况下,还应该引用:
$ echo 'this is a test' | tr '[a-z]' '[A-Z]'
THIS IS A TEST
您的系统上已安装该软件包的信息info
,tr 页面有一些非常好的示例和tr
命令的进一步解释:
info coreutils 'tr invocation'
对于您想要实现的目标,您可能需要使用 sed、perl 或 awk。
珀尔:
perl -pe "s/^/'/" file
对于每一行,匹配行的开头 ( ^
),替换为'
塞德:
sed "s/^/'/" file
类似于perl的例子
awk:
awk -v x="'" '{ print x$0 }' foo
将变量 x 指定为'
并为每一行打印'
然后打印整行
答案3
不,tr
仅用于一一替换字符。您不能通过这种方式添加字符。
你可以使用 perl 之类的东西来做到这一点:
perl -pe "s/\w+/'$&'/"
例如,tr
您只能用一种引用替换另一种引用:
tr \" \'
这些反斜杠只是告诉你的 shell 按原样发送字符,而不是尝试解释它本身。
这些是行不通的:
tr '"' '''
tr '"' '\''
第一个参数 ( '"'
) 很好,它与 完全相同\"
。在这两种情况下,第二个参数都不起作用:您不能使用单引号来引用单引号,因为第二个引号结束了引用,而第三个引号打开了一个丢失的新引号。 (因此你的 shell 会打开一个新行来等待丢失的结束引号。)
但这一切都只是空壳而已,与我们无关tr
。
答案4
最快的解决方案通常是使用最简单的单任务实用程序。
tr
是一个简单的实用程序,但还可以用于其他用途:音译(将给定字符转换为其他字符)、删除给定字符或压缩字符。
更通用的实用程序,例如sed
,awk
或perl
(按大小顺序)可以做到这一点,但在这里,您有一个单任务实用程序也可以很好地完成此操作paste
::
paste -d\' /dev/null file.txt /dev/null
或者:
:|paste -d\' - file.txt -