【问题标题】:if line begins with backslash in .txt file, do this如果行以 .txt 文件中的反斜杠开头,请执行此操作
【发布时间】:2018-04-02 15:21:18
【问题描述】:

我试图让一个 if 语句在 bash 中工作,它处理文本文件中以 \ 开头的行。

类似这样的:

shasum -a 256 file_A\\\\\/\/.txt >> file_B.txt
if line begins with '\' in file_B.txt
    then sed 's/^/^.{65}  /; s/$/$/' that line in file_C.txt
else
    if line not begin with '\' in file_B.txt
        then sed 's/^/^.{64}  /; s/$/$/' that line in file_C.txt
    fi
fi

file_B.txt 的内容:

e5fba57b49dbe8196ee4fb4ddb407885582f88d8e52dfa6e5adb55204b589a88  /Users/1337/file_D.txt
\66590f18dafff57160770d885b090d54455e0fc900342d7752dc420405ae50f5  /Users/1337/file_A\\\\::.txt

file_C.txt的内容:

/Users/1337/file_D.txt
/Users/1337/file_A\\::.txt

所以,基本上,最终结果将如下所示(在 file_C.txt 中):

^.{64}  /Users/1337/file_D.txt$
^.{65}  /Users/1337/file_A\\::.txt$

因为第 2 行以 \ 开头,而第 1 行没有。

如果其中有任何令人困惑的地方,请随时要求我澄清。

Mac OS X Yosemite,bash 3.2.57(1)-release

【问题讨论】:

    标签: bash macos if-statement sed


    【解决方案1】:

    这样的?

    while read -r line; do
        n=64; [ ${line:0:1} == \\ ] && n=65
        echo "^.{$n}  ${line#*  }\$"
    done <file_B.txt >file_C.txt
    

    【讨论】:

    • 这按预期工作。我将n=64n=65 替换为n={64}n={65}。我只是想知道,这在所有情况下都可以安全运行吗?
    • 我会将大括号添加到我的答案中(我可能会将它们放在回声中)。据我所知是安全的。你能举一个你担心的案例的例子吗?也许测试一下!
    • 别担心,我确实测试过了,我只是想确定一下。我只是不确定在{64}{65}(如n='{64}')周围缺少's 是否会导致任何问题。
    【解决方案2】:

    使用 sed

    sed -E 's/(\\?)([^ ]*)(.*)/\^.64\1\3$/;s/4\\/5/' file_B.txt
    

    在第一个 s 命令中

    (\\?)([^ ]*)(.*)/

    每行分为 3 组。
    第一个 '\' 是 optionel。
    第二个是你不需要的十六进制数据。
    第三个是伪路径

    /\^.64\1\3$/ 
    

    每一行都附加 ^.64
    第一组和第三组是keep
    每行前面都有 $

    在第二个s命令中

    s/4\\/5/
    

    4\ 被 5 替代

    【讨论】:

    • 我实际上需要它附加 ^.{64} ^.{65} 并前置 $。我怎样才能做到这一点?
    猜你喜欢
    • 2013-01-19
    • 2021-10-27
    • 2015-02-02
    • 1970-01-01
    • 2011-05-13
    • 2011-01-17
    • 2021-06-19
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多