仅使用bash /标准Linux命令在字符串中剥离单引号和双引号

20 linux bash quotes quoting

我正在寻找能够使用bash /标准Linux命令转换字符串的内容,如下所示:

  1. 应删除字符串周围的单引号
  2. 应删除字符串周围的双引号
  3. 不带引号的字符串应保持不变
  4. 具有无与伦比的周围引号的字符串应保持不变
  5. 不包含字符串的单引号应保留
  6. 不包含字符串的双引号应保留

例如:

  • '食物'应该成为食物
  • "食物"应该成为食物
  • 食物应该保持不变
  • "食物"应该保持不变
  • "食物"应该保持不变
  • 'Fo'od'应该成为Fo'od
  • "Fo'od"应该成为Fo'od
  • 佛陀应该保持不变
  • 'Fo"od'应该变成Fo"od
  • "Fo"od"应该变成Fo"od
  • Fo"od应该保持不变

谢谢!

ric*_*chq 32

这应该这样做:

sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
Run Code Online (Sandbox Code Playgroud)

in.txt在哪里:

"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
Run Code Online (Sandbox Code Playgroud)

而expected.txt是:

"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
Run Code Online (Sandbox Code Playgroud)

您可以检查它们是否匹配:

diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
Run Code Online (Sandbox Code Playgroud)

  • 我现在讨厌正则表达式. (5认同)
  • +1证明"有些人在遇到问题时会想"我知道,我会使用正则表达式."现在他们有两个问题." 是真实的! (2认同)

Tim*_*ost 16

你可以使用tr:

echo "$string" | tr -d 'chars to delete' 
Run Code Online (Sandbox Code Playgroud)

...也有效,但是已知'tr'在更老的(大约是Redhat 9-ish)发行版中存在问题.tr是'translate'的缩写,常用于管道转换输入.该-d选项仅表示"删除".

大多数现代版本还包含预定义的宏来转换从上到下,从下到上,杀死空白等等.因此,如果您使用它,请花一点时间来查看它的其他内容(请参阅帮助输出/手册页),派上用场了.


小智 12

VAR="'FOOD'"

VAR=$(eval echo $VAR)
Run Code Online (Sandbox Code Playgroud)

说明:由于shell已经理解了引号,因此您可以要求shell评估一个只是回显引用字符串的命令,就像您自己键入它时一样.

在这里,eval echo $VAR扩展为eval echo 'FOOD'因为引号实际上是值的一部分VAR.如果你遇到echo 'FOOD'了你得到的shell FOOD(没有引号).这就是eval:它接受输入并像shell命令一样运行它.


Var*_*han 7

你可能想用sed ......

echo $mystring | sed -s "s/^\(\(\"\(.*\)\"\)\|\('\(.*\)'\)\)\$/\\3\\5/g"
Run Code Online (Sandbox Code Playgroud)