使用 bash 在匹配后插入一个字符

使用 bash 在匹配后插入一个字符

我正在编写一个 bash 脚本。我需要在第一个字符出现后添加一个冒号。 /c/Users/ertwr/org/readme.html为了使用原生 Windows 浏览器打开它们,需要在单位字母后添加一个冒号/c:/Users/ertwr/org/readme.html

我使用以下表达式,它效果非常好,即使对于多个文件或空格也是如此,但仅适用于指定的单位,因为我无法在正则表达式中存储单位字母。

#!/usr/sbin/env bash 
IFS=$'\n'
${HOME}/scoop/shims/chrome "${@/\/\c\//\c\:\/}"

问题是仅有的按照字母的书写方式工作 C。所以我需要一种方法让它独立于字母工作任何信。

我尝试过但对多个文件或带空格的文件不起作用的方法:

- 无法捕获正则表达式

我真的希望这个能够起作用,但我做错了。

#!/usr/sbin/env bash
IFS=$'\n'

regex=(\/[a-zA-Z]\/)
if [[ "$@" =~ "$regex" ]]; then
    ${HOME}/scoop/shims/chrome "${@/$BASH_REMATCH/${BASH_REMATCH}\:}"
fi

-sed 附加

#!/usr/sbin/env bash 
IFS=$'\n'
WADDR=`sed 's|\<[a-zA-Z]\>|&:|' "$@"`
${HOME}/scoop/shims/chrome "${WADDR}"

Sed 特别将文件内容作为 url 而不是文件名称提供。当使用文本文件作为输入时,它可以工作。

答案1

要将 WSL 样式路径转换为 ​​Windows 样式,请使用-w带有二进制的选项wslpath默认情况下WSL 中的挂载路径是/mnt我在示例中选择的。您可以/mnt从路径中删除该部分。

例如,

  • 命令:wslpath -w "/mnt/c/Windows/System32"
  • 输出:C:\Windows\System32

要获得更多有效选项,只需执行wslpath,它将显示帮助页面:

wslpath: Invalid argument
Usage:
    -a    force result to absolute path format
    -u    translate from a Windows path to a WSL path (default)
    -w    translate from a WSL path to a Windows path
    -m    translate from a WSL path to a Windows path, with '/' instead of '\'

EX: wslpath 'c:\users'

这是一个简单 shell 脚本示例在记事本中打开文本文件:

#! /bin/sh

read -p "Enter WSL style path: " variable
echo "Opening file in Notepad.exe"
/mnt/c/Windows/System32/Notepad.exe $(wslpath -w "$variable")

以下是问题的修改后的 shell 脚本:

#!/bin/sh
IFS=$'\n'
echo "${@}"
WADDR="$(/bin/wslpath -w "${@}")"
/mnt/c/Windows/System32/Notepad.exe "${WADDR}"

更多细节:

答案2

谁知道呢?我自己解决了。

#!/usr/sbin/env bash
IFS=$'\n'

if [[ "$@" =~ \/([a-zA-Z])\/ ]]; then 
    ${HOME}/scoop/shims/chrome "${@/$BASH_REMATCH/\/${BASH_REMATCH[1]}\:\/}"
fi

因此,为了使其与 NT URI 兼容,为了将其提供给二进制文件,我只需要删除其中一个匹配项,/如下所示。

#!/usr/sbin/env bash
IFS=$'\n'

if [[ "$@" =~ \/([a-zA-Z])\/ ]]; then 
    ${HOME}/scoop/shims/chrome.exe "${@/$BASH_REMATCH/${BASH_REMATCH[1]}\:\/}"
fi

无需自投和白人高手的点赞。只需编码。

相关内容